From 6f7b6dd12cddacbdef29c312ce96cb47522d1c84 Mon Sep 17 00:00:00 2001 From: Michele Bigi Date: Sat, 8 Aug 2026 21:15:22 +0200 Subject: [PATCH] Add internet radio streaming with runtime API, modernize web UI, remove auto-tune/beep at boot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Streaming (main feature this session): - New WebRadioConfig/WebRadioJson core types, ISecureStore-backed persistence - New webradio::WebRadioService (thread-safe live config) + GET/POST /api/streaming - web_radio_stream task now runtime-toggleable (no reboot), no hardcoded URL - Content-Type diagnostic: warns clearly when a URL is a webpage, not an audio stream Boot cleanup: - Removed boot-time auto FM/DAB tune, auto-beep, and the (now-concluded) Si4684 crystal IBIAS/CTUN empirical sweep from main.cpp — tuning/beep are on-demand via the existing REST API only Web UI: - Modernized styling (cards, gradients, toggle switches, light/dark theme) - New Stream tab wired to /api/streaming Fixes found via real idf.py build (not just clangd): - Restored wrongly-removed si4684/Si4684Tuner.hpp include in main.cpp - Fixed MP3Decode() argument types in web_radio_stream.cpp (unsigned char**/int*) Quality-gate fixes: - Host-test stub headers (esp_log.h, freertos/*) so TunerService.cpp's scanForStation logging/pacing compiles for station_service_test / integration_service_test instead of running stale binaries - Added WifiScanner and WebRadioService manual sections; filled in missing Doxygen docs on BluetoothService, i2s_sdata_probe, test_firmware, Bt1035At - Ignore clangd's .cache/ index directory Also includes prior uncommitted work carried in the tree: Wi-Fi/Bluetooth device scan REST API and UI (WifiScanner, BT scan), SigmaStudio TCP bridge, and the current ADAU1701 SigmaStudio DSP program export. Co-Authored-By: Claude Sonnet 5 --- Software/.gitignore | 3 + Software/CMakeLists.txt | 1 - .../Firmware/ADAU1701-Firmware/DigiRadio.hex | 12 +- .../ADAU1701-Firmware/DigiRadio.params | 558 ++-- .../Firmware/ADAU1701-Firmware/DigiRadio.xml | 276 +- .../ADAU1701-Firmware/DigiRadio_IC_1.h | 598 ++-- .../ADAU1701-Firmware/DigiRadio_IC_1_PARAM.h | 238 +- .../ADAU1701-Firmware/DigiRadio_IC_1_REG.h | 8 +- .../ADAU1701-Firmware/DigiRadio_NetList.xml | 34 +- .../ADAU1701-Firmware/SigmaStudioFW.h | 41 + .../ADAU1701-Firmware/TxBuffer_IC_1.dat | 592 ++-- Software/Firmware/ADAU1701-Firmware/defines.h | 2 +- Software/Sigmastudio/DigiRadio.dspproj | Bin 0 -> 49977 bytes Software/Sigmastudio/DigiRadio.zip | Bin 0 -> 22744 bytes Software/Sigmastudio/DigiRadioTest.zip | Bin 0 -> 22126 bytes .../Sigmastudio/DigiRadioTest/DigiRadio.hex | 1025 ++++++ .../DigiRadioTest/DigiRadio.params | 2962 +++++++++++++++++ .../Sigmastudio/DigiRadioTest/DigiRadio.xml | 944 ++++++ .../DigiRadioTest/DigiRadio_IC_1.h | 2119 ++++++++++++ .../DigiRadioTest/DigiRadio_IC_1_PARAM.h | 459 +++ .../DigiRadioTest/DigiRadio_IC_1_REG.h | 565 ++++ .../DigiRadioTest/DigiRadio_NetList.xml | 82 + .../DigiRadioTest/NumBytes_IC_1.dat | 5 + .../DigiRadioTest/TxBuffer_IC_1.dat | 2060 ++++++++++++ Software/Sigmastudio/DigiRadioTest/defines.h | 26 + .../DigiRadioTest/digiradio_beep_enabled.drad | Bin 0 -> 9276 bytes .../DigiRadioTest/digiradio_test.drad | Bin 0 -> 9276 bytes Software/components/core/CMakeLists.txt | 2 + .../core/include/core/AudioProfileJson.hpp | 14 + .../core/include/core/BluetoothJson.hpp | 88 + .../components/core/include/core/Bt1035At.hpp | 207 +- .../core/include/core/Bt1035ScannedDevice.hpp | 39 + .../core/include/core/BtSpeakerTarget.hpp | 34 + .../core/include/core/CompanionChipStatus.hpp | 2 +- .../components/core/include/core/IDsp.hpp | 15 + .../core/include/core/ISecureStore.hpp | 92 + .../core/include/core/MixerState.hpp | 18 +- .../core/include/core/TunerJson.hpp | 64 + .../core/include/core/TunerStatus.hpp | 1 + .../core/include/core/WebRadioConfig.hpp | 52 + .../core/include/core/WebRadioJson.hpp | 66 + .../core/include/core/WifiScanJson.hpp | 50 + .../core/include/core/WifiScannedNetwork.hpp | 37 + .../components/core/src/AudioProfileJson.cpp | 32 + .../components/core/src/BluetoothJson.cpp | 109 + Software/components/core/src/Bt1035At.cpp | 223 +- Software/components/core/src/MixerState.cpp | 14 + Software/components/core/src/TunerJson.cpp | 70 + Software/components/core/src/WebRadioJson.cpp | 89 + Software/components/core/src/WifiScanJson.cpp | 73 + Software/components/core/test/CMakeLists.txt | 12 + .../core/test/audio_profile_json_test.cpp | 28 + .../components/core/test/bt1035_at_test.cpp | 127 +- .../components/core/test/host_stubs/esp_log.h | 21 + .../core/test/host_stubs/freertos/FreeRTOS.h | 19 + .../core/test/host_stubs/freertos/task.h | 18 + .../core/test/integration_service_test.cpp | 58 + .../core/test/station_service_test.cpp | 45 + .../core/test/web_radio_json_test.cpp | 73 + .../components/core/test/wifi_scan_test.cpp | 121 + .../include/adau1701/Adau1701Driver.hpp | 14 + .../adau1701/include/adau1701/Adau1701Dsp.hpp | 3 + .../drivers/adau1701/src/Adau1701Driver.cpp | 562 ++-- .../drivers/adau1701/src/Adau1701Dsp.cpp | 8 + .../adau1701/src/FlashDspProgramSource.cpp | 62 +- .../drivers/adau1701/src/SigmaStudioFW.c | 120 +- .../bt1035/include/bt1035/Bt1035Driver.hpp | 121 +- .../drivers/bt1035/src/Bt1035Driver.cpp | 649 +++- .../si4684/include/si4684/Si4684Driver.hpp | 16 +- .../si4684/include/si4684/Si4684Tuner.hpp | 15 + .../si4684/include/si4684/Si4684Types.hpp | 11 +- .../drivers/si4684/src/Si4684Driver.cpp | 355 +- .../drivers/si4684/src/Si4684Tuner.cpp | 143 +- Software/components/net/CMakeLists.txt | 4 +- .../net/include/net/NetBootstrap.hpp | 21 +- .../components/net/include/net/NetError.hpp | 2 + .../net/include/net/SetupWebServer.hpp | 8 +- .../net/include/net/SigmaStudioTcpServer.hpp | 133 + .../components/net/include/net/StaClient.hpp | 4 + .../net/include/net/WifiScanner.hpp | 50 + Software/components/net/src/NetBootstrap.cpp | 33 +- .../components/net/src/SetupWebServer.cpp | 650 +++- .../net/src/SigmaStudioTcpServer.cpp | 570 ++++ Software/components/net/src/SoftApHost.cpp | 9 +- Software/components/net/src/StaClient.cpp | 149 +- Software/components/net/src/WifiScanner.cpp | 220 ++ Software/components/net/www/index.html | 828 ++++- Software/components/net/www/index.html.gz | Bin 8105 -> 13322 bytes .../include/secure_store/NvsSecureStore.hpp | 19 + .../secure_store/src/NvsSecureStore.cpp | 181 +- .../audio/include/audio/AudioService.hpp | 29 + .../services/audio/src/AudioService.cpp | 24 + .../services/bluetooth/CMakeLists.txt | 2 +- .../include/bluetooth/BluetoothService.hpp | 173 +- .../bluetooth/src/BluetoothService.cpp | 207 +- .../components/services/tuner/CMakeLists.txt | 2 +- .../tuner/include/tuner/TunerService.hpp | 15 + .../services/tuner/src/TunerService.cpp | 263 ++ .../services/webradio/CMakeLists.txt | 8 + .../include/webradio/WebRadioService.hpp | 91 + .../services/webradio/src/WebRadioService.cpp | 72 + .../docs/BT1035_Documentation/01_Overview.md | 10 + .../BT1035_Documentation/02_Configuration.md | 16 + .../03_AT_Command_Reference.md | 16 + .../04_Hardware_Integration_Notes.md | 10 + .../05_Troubleshooting.md | 6 + .../DigiRadio_FSC_BT1035_Documentation.zip | Bin 0 -> 4950 bytes .../01_Hardware_Integration_Manual.md | 13 + .../02_Firmware_Configuration_Guide.md | 12 + .../03_Command_Execution_DeepDive.md | 13 + .../04_Audio_DSP_Integration.md | 11 + .../05_DigiRadio_System_Mapping.md | 8 + Software/docs/audio-bringup-handoff.md | 298 ++ Software/docs/claude-code-audio-bringup.md | 371 +++ Software/docs/manual/ch-adau1701.tex | 99 +- Software/docs/manual/ch-bt1035.tex | 62 +- Software/docs/manual/ch-classes.tex | 21 +- Software/docs/manual/ch-firmware.tex | 4 +- Software/docs/manual/ch-hardware.tex | 4 +- Software/docs/manual/ch-sigmastudio.tex | 23 +- Software/main/CMakeLists.txt | 5 +- Software/main/Kconfig.projbuild | 20 + Software/main/hardware_bootstrap.cpp | 7 +- Software/main/i2s_sdata_probe.cpp | 149 + Software/main/i2s_sdata_probe.hpp | 24 + Software/main/idf_component.yml | 1 + Software/main/main.cpp | 128 +- Software/main/test_firmware.cpp | 11 +- Software/main/test_firmware.hpp | 6 + Software/main/web_radio_stream.cpp | 263 ++ Software/main/web_radio_stream.hpp | 31 + 131 files changed, 20309 insertions(+), 1702 deletions(-) create mode 100644 Software/Sigmastudio/DigiRadio.dspproj create mode 100644 Software/Sigmastudio/DigiRadio.zip create mode 100644 Software/Sigmastudio/DigiRadioTest.zip create mode 100644 Software/Sigmastudio/DigiRadioTest/DigiRadio.hex create mode 100644 Software/Sigmastudio/DigiRadioTest/DigiRadio.params create mode 100644 Software/Sigmastudio/DigiRadioTest/DigiRadio.xml create mode 100644 Software/Sigmastudio/DigiRadioTest/DigiRadio_IC_1.h create mode 100644 Software/Sigmastudio/DigiRadioTest/DigiRadio_IC_1_PARAM.h create mode 100644 Software/Sigmastudio/DigiRadioTest/DigiRadio_IC_1_REG.h create mode 100644 Software/Sigmastudio/DigiRadioTest/DigiRadio_NetList.xml create mode 100644 Software/Sigmastudio/DigiRadioTest/NumBytes_IC_1.dat create mode 100644 Software/Sigmastudio/DigiRadioTest/TxBuffer_IC_1.dat create mode 100644 Software/Sigmastudio/DigiRadioTest/defines.h create mode 100644 Software/Sigmastudio/DigiRadioTest/digiradio_beep_enabled.drad create mode 100644 Software/Sigmastudio/DigiRadioTest/digiradio_test.drad create mode 100644 Software/components/core/include/core/Bt1035ScannedDevice.hpp create mode 100644 Software/components/core/include/core/BtSpeakerTarget.hpp create mode 100644 Software/components/core/include/core/WebRadioConfig.hpp create mode 100644 Software/components/core/include/core/WebRadioJson.hpp create mode 100644 Software/components/core/include/core/WifiScanJson.hpp create mode 100644 Software/components/core/include/core/WifiScannedNetwork.hpp create mode 100644 Software/components/core/src/WebRadioJson.cpp create mode 100644 Software/components/core/src/WifiScanJson.cpp create mode 100644 Software/components/core/test/host_stubs/esp_log.h create mode 100644 Software/components/core/test/host_stubs/freertos/FreeRTOS.h create mode 100644 Software/components/core/test/host_stubs/freertos/task.h create mode 100644 Software/components/core/test/web_radio_json_test.cpp create mode 100644 Software/components/core/test/wifi_scan_test.cpp create mode 100644 Software/components/net/include/net/SigmaStudioTcpServer.hpp create mode 100644 Software/components/net/include/net/WifiScanner.hpp create mode 100644 Software/components/net/src/SigmaStudioTcpServer.cpp create mode 100644 Software/components/net/src/WifiScanner.cpp create mode 100644 Software/components/services/webradio/CMakeLists.txt create mode 100644 Software/components/services/webradio/include/webradio/WebRadioService.hpp create mode 100644 Software/components/services/webradio/src/WebRadioService.cpp create mode 100644 Software/docs/BT1035_Documentation/01_Overview.md create mode 100644 Software/docs/BT1035_Documentation/02_Configuration.md create mode 100644 Software/docs/BT1035_Documentation/03_AT_Command_Reference.md create mode 100644 Software/docs/BT1035_Documentation/04_Hardware_Integration_Notes.md create mode 100644 Software/docs/BT1035_Documentation/05_Troubleshooting.md create mode 100644 Software/docs/BT1035_Documentation/DigiRadio_FSC_BT1035_Documentation.zip create mode 100644 Software/docs/BT1035_Documentation/DigiRadio_FSC_BT1035_Documentation/01_Hardware_Integration_Manual.md create mode 100644 Software/docs/BT1035_Documentation/DigiRadio_FSC_BT1035_Documentation/02_Firmware_Configuration_Guide.md create mode 100644 Software/docs/BT1035_Documentation/DigiRadio_FSC_BT1035_Documentation/03_Command_Execution_DeepDive.md create mode 100644 Software/docs/BT1035_Documentation/DigiRadio_FSC_BT1035_Documentation/04_Audio_DSP_Integration.md create mode 100644 Software/docs/BT1035_Documentation/DigiRadio_FSC_BT1035_Documentation/05_DigiRadio_System_Mapping.md create mode 100644 Software/docs/audio-bringup-handoff.md create mode 100644 Software/docs/claude-code-audio-bringup.md create mode 100644 Software/main/Kconfig.projbuild create mode 100644 Software/main/i2s_sdata_probe.cpp create mode 100644 Software/main/i2s_sdata_probe.hpp create mode 100644 Software/main/web_radio_stream.cpp create mode 100644 Software/main/web_radio_stream.hpp diff --git a/Software/.gitignore b/Software/.gitignore index d321a78..eddc28d 100644 --- a/Software/.gitignore +++ b/Software/.gitignore @@ -18,6 +18,9 @@ docs/api/ __pycache__/ *.pyc +# clangd index cache +.cache/ + # Proprietary Si4684 firmware blobs (Skyworks / uGreen — local only, not in git) Firmware/Si4684-Firmware/*.bin Firmware/Si4684-Firmware/.ugreen-extract-*/ diff --git a/Software/CMakeLists.txt b/Software/CMakeLists.txt index ec1a1a4..9fba81d 100644 --- a/Software/CMakeLists.txt +++ b/Software/CMakeLists.txt @@ -1,6 +1,5 @@ # DigiRadio firmware — top-level ESP-IDF project cmake_minimum_required(VERSION 3.16) - include($ENV{IDF_PATH}/tools/cmake/project.cmake) # Nested driver/service components live under components/ diff --git a/Software/Firmware/ADAU1701-Firmware/DigiRadio.hex b/Software/Firmware/ADAU1701-Firmware/DigiRadio.hex index fe22d45..bd61360 100644 --- a/Software/Firmware/ADAU1701-Firmware/DigiRadio.hex +++ b/Software/Firmware/ADAU1701-Firmware/DigiRadio.hex @@ -1,3 +1,9 @@ +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x6C , 0xAC , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , 0x00 , 0x80 , 0x00 , 0x00 , 0x00 , 0x80 , 0x00 , 0x00 , 0x00 , 0x80 , 0x00 , 0x00 , @@ -1016,10 +1022,4 @@ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , -0x00 , 0x00 , 0x00 , 0x00 , -0x00 , 0x00 , 0x00 , 0x00 , -0x00 , 0x00 , 0x00 , 0x00 , -0x00 , 0x00 , 0x00 , 0x00 , -0x00 , 0x00 , 0x00 , 0x00 , -0x00 , 0x00 , 0x00 , 0x00 , diff --git a/Software/Firmware/ADAU1701-Firmware/DigiRadio.params b/Software/Firmware/ADAU1701-Firmware/DigiRadio.params index ea5382b..ace2c4d 100644 --- a/Software/Firmware/ADAU1701-Firmware/DigiRadio.params +++ b/Software/Firmware/ADAU1701-Firmware/DigiRadio.params @@ -1,6 +1,6 @@ Cell Name = Si4674 Parameter Name = Gain1940AlgNS1 -Parameter Address = 0 +Parameter Address = 3 Parameter Value = 1 Parameter Data : 0x00, 0x80, 0x00, 0x00, @@ -9,7 +9,7 @@ Parameter Data : Cell Name = Si4674 Parameter Name = Gain1940AlgNS2 -Parameter Address = 1 +Parameter Address = 4 Parameter Value = 1 Parameter Data : 0x00, 0x80, 0x00, 0x00, @@ -18,7 +18,7 @@ Parameter Data : Cell Name = ESP32 Parameter Name = Gain1940AlgNS3 -Parameter Address = 2 +Parameter Address = 5 Parameter Value = 1 Parameter Data : 0x00, 0x80, 0x00, 0x00, @@ -27,7 +27,7 @@ Parameter Data : Cell Name = ESP32 Parameter Name = Gain1940AlgNS4 -Parameter Address = 3 +Parameter Address = 6 Parameter Value = 1 Parameter Data : 0x00, 0x80, 0x00, 0x00, @@ -36,7 +36,7 @@ Parameter Data : Cell Name = St Mixer1 Parameter Name = StereoMixerAlg12 -Parameter Address = 4 +Parameter Address = 9 Parameter Value = 1 Parameter Data : 0x00, 0x80, 0x00, 0x00, @@ -45,7 +45,16 @@ Parameter Data : Cell Name = St Mixer1 Parameter Name = StereoMixerAlg14 -Parameter Address = 5 +Parameter Address = 10 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + +Cell Name = St Mixer1 +Parameter Name = StereoMixerAlg16 +Parameter Address = 11 Parameter Value = 1 Parameter Data : 0x00, 0x80, 0x00, 0x00, @@ -54,7 +63,7 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan10B1 -Parameter Address = 6 +Parameter Address = 12 Parameter Value = 0.99815046787262 Parameter Data : 0x00 , 0x7F , 0xC3 , 0x65 , @@ -63,7 +72,7 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan11B1 -Parameter Address = 7 +Parameter Address = 13 Parameter Value = -1.99630105495453 Parameter Data : 0x0F , 0x00 , 0x79 , 0x35 , @@ -72,7 +81,7 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan12B1 -Parameter Address = 8 +Parameter Address = 14 Parameter Value = 0.99815046787262 Parameter Data : 0x00 , 0x7F , 0xC3 , 0x65 , @@ -81,7 +90,7 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan11A1 -Parameter Address = 9 +Parameter Address = 15 Parameter Value = 1.99629759788513 Parameter Data : 0x00 , 0xFF , 0x86 , 0xAE , @@ -90,7 +99,7 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan12A1 -Parameter Address = 10 +Parameter Address = 16 Parameter Value = -0.996304392814636 Parameter Data : 0x0F , 0x80 , 0x79 , 0x19 , @@ -99,7 +108,7 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan10B2 -Parameter Address = 11 +Parameter Address = 17 Parameter Value = 1 Parameter Data : 0x00 , 0x80 , 0x00 , 0x00 , @@ -108,60 +117,6 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan11B2 -Parameter Address = 12 -Parameter Value = 0 -Parameter Data : -0x00 , 0x00 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12B2 -Parameter Address = 13 -Parameter Value = 0 -Parameter Data : -0x00 , 0x00 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11A2 -Parameter Address = 14 -Parameter Value = 0 -Parameter Data : -0x00 , 0x00 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12A2 -Parameter Address = 15 -Parameter Value = 0 -Parameter Data : -0x00 , 0x00 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan10B3 -Parameter Address = 16 -Parameter Value = 1 -Parameter Data : -0x00 , 0x80 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11B3 -Parameter Address = 17 -Parameter Value = 0 -Parameter Data : -0x00 , 0x00 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12B3 Parameter Address = 18 Parameter Value = 0 Parameter Data : @@ -170,7 +125,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11A3 +Parameter Name = PEQ1Chan12B2 Parameter Address = 19 Parameter Value = 0 Parameter Data : @@ -179,7 +134,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12A3 +Parameter Name = PEQ1Chan11A2 Parameter Address = 20 Parameter Value = 0 Parameter Data : @@ -188,17 +143,8 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan10B4 +Parameter Name = PEQ1Chan12A2 Parameter Address = 21 -Parameter Value = 1 -Parameter Data : -0x00 , 0x80 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11B4 -Parameter Address = 22 Parameter Value = 0 Parameter Data : 0x00 , 0x00 , 0x00 , 0x00 , @@ -206,7 +152,16 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12B4 +Parameter Name = PEQ1Chan10B3 +Parameter Address = 22 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B3 Parameter Address = 23 Parameter Value = 0 Parameter Data : @@ -215,7 +170,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11A4 +Parameter Name = PEQ1Chan12B3 Parameter Address = 24 Parameter Value = 0 Parameter Data : @@ -224,7 +179,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12A4 +Parameter Name = PEQ1Chan11A3 Parameter Address = 25 Parameter Value = 0 Parameter Data : @@ -233,17 +188,8 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan10B5 +Parameter Name = PEQ1Chan12A3 Parameter Address = 26 -Parameter Value = 1 -Parameter Data : -0x00 , 0x80 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11B5 -Parameter Address = 27 Parameter Value = 0 Parameter Data : 0x00 , 0x00 , 0x00 , 0x00 , @@ -251,7 +197,16 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12B5 +Parameter Name = PEQ1Chan10B4 +Parameter Address = 27 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B4 Parameter Address = 28 Parameter Value = 0 Parameter Data : @@ -260,7 +215,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11A5 +Parameter Name = PEQ1Chan12B4 Parameter Address = 29 Parameter Value = 0 Parameter Data : @@ -269,7 +224,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12A5 +Parameter Name = PEQ1Chan11A4 Parameter Address = 30 Parameter Value = 0 Parameter Data : @@ -278,17 +233,8 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan10B6 +Parameter Name = PEQ1Chan12A4 Parameter Address = 31 -Parameter Value = 1 -Parameter Data : -0x00 , 0x80 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11B6 -Parameter Address = 32 Parameter Value = 0 Parameter Data : 0x00 , 0x00 , 0x00 , 0x00 , @@ -296,7 +242,16 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12B6 +Parameter Name = PEQ1Chan10B5 +Parameter Address = 32 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B5 Parameter Address = 33 Parameter Value = 0 Parameter Data : @@ -305,7 +260,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11A6 +Parameter Name = PEQ1Chan12B5 Parameter Address = 34 Parameter Value = 0 Parameter Data : @@ -314,7 +269,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12A6 +Parameter Name = PEQ1Chan11A5 Parameter Address = 35 Parameter Value = 0 Parameter Data : @@ -322,9 +277,63 @@ Parameter Data : +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A5 +Parameter Address = 36 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B6 +Parameter Address = 37 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B6 +Parameter Address = 38 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B6 +Parameter Address = 39 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A6 +Parameter Address = 40 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A6 +Parameter Address = 41 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + Cell Name = Param EQ1 Parameter Name = PEQ1Chan10B1 -Parameter Address = 6 +Parameter Address = 12 Parameter Value = 0.99815046787262 Parameter Data : 0x00 , 0x7F , 0xC3 , 0x65 , @@ -333,7 +342,7 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan11B1 -Parameter Address = 7 +Parameter Address = 13 Parameter Value = -1.99630105495453 Parameter Data : 0x0F , 0x00 , 0x79 , 0x35 , @@ -342,7 +351,7 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan12B1 -Parameter Address = 8 +Parameter Address = 14 Parameter Value = 0.99815046787262 Parameter Data : 0x00 , 0x7F , 0xC3 , 0x65 , @@ -351,7 +360,7 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan11A1 -Parameter Address = 9 +Parameter Address = 15 Parameter Value = 1.99629759788513 Parameter Data : 0x00 , 0xFF , 0x86 , 0xAE , @@ -360,7 +369,7 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan12A1 -Parameter Address = 10 +Parameter Address = 16 Parameter Value = -0.996304392814636 Parameter Data : 0x0F , 0x80 , 0x79 , 0x19 , @@ -369,7 +378,7 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan10B2 -Parameter Address = 11 +Parameter Address = 17 Parameter Value = 1 Parameter Data : 0x00 , 0x80 , 0x00 , 0x00 , @@ -378,60 +387,6 @@ Parameter Data : Cell Name = Param EQ1 Parameter Name = PEQ1Chan11B2 -Parameter Address = 12 -Parameter Value = 0 -Parameter Data : -0x00 , 0x00 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12B2 -Parameter Address = 13 -Parameter Value = 0 -Parameter Data : -0x00 , 0x00 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11A2 -Parameter Address = 14 -Parameter Value = 0 -Parameter Data : -0x00 , 0x00 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12A2 -Parameter Address = 15 -Parameter Value = 0 -Parameter Data : -0x00 , 0x00 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan10B3 -Parameter Address = 16 -Parameter Value = 1 -Parameter Data : -0x00 , 0x80 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11B3 -Parameter Address = 17 -Parameter Value = 0 -Parameter Data : -0x00 , 0x00 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12B3 Parameter Address = 18 Parameter Value = 0 Parameter Data : @@ -440,7 +395,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11A3 +Parameter Name = PEQ1Chan12B2 Parameter Address = 19 Parameter Value = 0 Parameter Data : @@ -449,7 +404,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12A3 +Parameter Name = PEQ1Chan11A2 Parameter Address = 20 Parameter Value = 0 Parameter Data : @@ -458,17 +413,8 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan10B4 +Parameter Name = PEQ1Chan12A2 Parameter Address = 21 -Parameter Value = 1 -Parameter Data : -0x00 , 0x80 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11B4 -Parameter Address = 22 Parameter Value = 0 Parameter Data : 0x00 , 0x00 , 0x00 , 0x00 , @@ -476,7 +422,16 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12B4 +Parameter Name = PEQ1Chan10B3 +Parameter Address = 22 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B3 Parameter Address = 23 Parameter Value = 0 Parameter Data : @@ -485,7 +440,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11A4 +Parameter Name = PEQ1Chan12B3 Parameter Address = 24 Parameter Value = 0 Parameter Data : @@ -494,7 +449,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12A4 +Parameter Name = PEQ1Chan11A3 Parameter Address = 25 Parameter Value = 0 Parameter Data : @@ -503,17 +458,8 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan10B5 +Parameter Name = PEQ1Chan12A3 Parameter Address = 26 -Parameter Value = 1 -Parameter Data : -0x00 , 0x80 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11B5 -Parameter Address = 27 Parameter Value = 0 Parameter Data : 0x00 , 0x00 , 0x00 , 0x00 , @@ -521,7 +467,16 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12B5 +Parameter Name = PEQ1Chan10B4 +Parameter Address = 27 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B4 Parameter Address = 28 Parameter Value = 0 Parameter Data : @@ -530,7 +485,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11A5 +Parameter Name = PEQ1Chan12B4 Parameter Address = 29 Parameter Value = 0 Parameter Data : @@ -539,7 +494,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12A5 +Parameter Name = PEQ1Chan11A4 Parameter Address = 30 Parameter Value = 0 Parameter Data : @@ -548,17 +503,8 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan10B6 +Parameter Name = PEQ1Chan12A4 Parameter Address = 31 -Parameter Value = 1 -Parameter Data : -0x00 , 0x80 , 0x00 , 0x00 , - - - -Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11B6 -Parameter Address = 32 Parameter Value = 0 Parameter Data : 0x00 , 0x00 , 0x00 , 0x00 , @@ -566,7 +512,16 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12B6 +Parameter Name = PEQ1Chan10B5 +Parameter Address = 32 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B5 Parameter Address = 33 Parameter Value = 0 Parameter Data : @@ -575,7 +530,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan11A6 +Parameter Name = PEQ1Chan12B5 Parameter Address = 34 Parameter Value = 0 Parameter Data : @@ -584,7 +539,7 @@ Parameter Data : Cell Name = Param EQ1 -Parameter Name = PEQ1Chan12A6 +Parameter Name = PEQ1Chan11A5 Parameter Address = 35 Parameter Value = 0 Parameter Data : @@ -592,9 +547,63 @@ Parameter Data : +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A5 +Parameter Address = 36 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B6 +Parameter Address = 37 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B6 +Parameter Address = 38 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B6 +Parameter Address = 39 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A6 +Parameter Address = 40 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A6 +Parameter Address = 41 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + Cell Name = Multiple 1 Parameter Name = Gain1940AlgNS5 -Parameter Address = 36 +Parameter Address = 42 Parameter Value = 1 Parameter Data : 0x00, 0x80, 0x00, 0x00, @@ -603,7 +612,7 @@ Parameter Data : Cell Name = Multiple 1 Parameter Name = Gain1940AlgNS6 -Parameter Address = 37 +Parameter Address = 43 Parameter Value = 1 Parameter Data : 0x00, 0x80, 0x00, 0x00, @@ -612,7 +621,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1slope_1 -Parameter Address = 38 +Parameter Address = 44 Parameter Value = -0.014285683631897 Parameter Data : 0x0F, 0xFE, 0x2B, 0xE3, @@ -621,7 +630,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1inter_1 -Parameter Address = 39 +Parameter Address = 45 Parameter Value = 0.27142858505249 Parameter Data : 0x00, 0x22, 0xBE, 0x2C, @@ -630,7 +639,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1slope_2 -Parameter Address = 40 +Parameter Address = 46 Parameter Value = -0.166666626930237 Parameter Data : 0x0F, 0xEA, 0xAA, 0xAB, @@ -639,7 +648,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1inter_2 -Parameter Address = 41 +Parameter Address = 47 Parameter Value = 0.833333373069763 Parameter Data : 0x00, 0x6A, 0xAA, 0xAB, @@ -648,7 +657,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1slope_3 -Parameter Address = 42 +Parameter Address = 48 Parameter Value = -0.79365074634552 Parameter Data : 0x0F, 0x9A, 0x69, 0xA7, @@ -657,7 +666,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1inter_3 -Parameter Address = 43 +Parameter Address = 49 Parameter Value = 1.98412692546844 Parameter Data : 0x00, 0xFD, 0xF7, 0xDF, @@ -666,7 +675,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1slope_4 -Parameter Address = 44 +Parameter Address = 50 Parameter Value = -15.5279502868652 Parameter Data : 0x08, 0x3C, 0x6C, 0x20, @@ -675,7 +684,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1inter_4 -Parameter Address = 45 +Parameter Address = 51 Parameter Value = 7.91925466060638 Parameter Data : 0x03, 0xF5, 0xAA, 0x23, @@ -684,7 +693,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1comp1 -Parameter Address = 46 +Parameter Address = 52 Parameter Value = 3 Parameter Data : 0x01, 0x80, 0x00, 0x00, @@ -693,7 +702,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1comp2 -Parameter Address = 47 +Parameter Address = 53 Parameter Value = 2 Parameter Data : 0x01, 0x00, 0x00, 0x00, @@ -702,7 +711,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1comp3 -Parameter Address = 48 +Parameter Address = 54 Parameter Value = 0.399999976158142 Parameter Data : 0x00, 0x33, 0x33, 0x33, @@ -711,7 +720,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1RMS_MONO_TCONST -Parameter Address = 50 +Parameter Address = 56 Parameter Value = 0.000239849090576172 Parameter Data : 0x00, 0x00, 0x07, 0xDC, @@ -720,7 +729,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1threshold -Parameter Address = 49 +Parameter Address = 55 Parameter Value = 1 Parameter Data : 0x00, 0x80, 0x00, 0x00, @@ -729,7 +738,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1decay -Parameter Address = 51 +Parameter Address = 57 Parameter Value = 0.000244140625 Parameter Data : 0x00, 0x00, 0x08, 0x00, @@ -738,7 +747,7 @@ Parameter Data : Cell Name = Limiter 1 Parameter Name = limiterAlg1decaycomplement -Parameter Address = 52 +Parameter Address = 58 Parameter Value = 0.99951171875 Parameter Data : 0x00, 0x7F, 0xF0, 0x00, @@ -747,7 +756,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2slope_1 -Parameter Address = 53 +Parameter Address = 59 Parameter Value = -0.014285683631897 Parameter Data : 0x0F, 0xFE, 0x2B, 0xE3, @@ -756,7 +765,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2inter_1 -Parameter Address = 54 +Parameter Address = 60 Parameter Value = 0.27142858505249 Parameter Data : 0x00, 0x22, 0xBE, 0x2C, @@ -765,7 +774,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2slope_2 -Parameter Address = 55 +Parameter Address = 61 Parameter Value = -0.166666626930237 Parameter Data : 0x0F, 0xEA, 0xAA, 0xAB, @@ -774,7 +783,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2inter_2 -Parameter Address = 56 +Parameter Address = 62 Parameter Value = 0.833333373069763 Parameter Data : 0x00, 0x6A, 0xAA, 0xAB, @@ -783,7 +792,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2slope_3 -Parameter Address = 57 +Parameter Address = 63 Parameter Value = -0.79365074634552 Parameter Data : 0x0F, 0x9A, 0x69, 0xA7, @@ -792,7 +801,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2inter_3 -Parameter Address = 58 +Parameter Address = 64 Parameter Value = 1.98412692546844 Parameter Data : 0x00, 0xFD, 0xF7, 0xDF, @@ -801,7 +810,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2slope_4 -Parameter Address = 59 +Parameter Address = 65 Parameter Value = -15.5279502868652 Parameter Data : 0x08, 0x3C, 0x6C, 0x20, @@ -810,7 +819,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2inter_4 -Parameter Address = 60 +Parameter Address = 66 Parameter Value = 7.91925466060638 Parameter Data : 0x03, 0xF5, 0xAA, 0x23, @@ -819,7 +828,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2comp1 -Parameter Address = 61 +Parameter Address = 67 Parameter Value = 3 Parameter Data : 0x01, 0x80, 0x00, 0x00, @@ -828,7 +837,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2comp2 -Parameter Address = 62 +Parameter Address = 68 Parameter Value = 2 Parameter Data : 0x01, 0x00, 0x00, 0x00, @@ -837,7 +846,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2comp3 -Parameter Address = 63 +Parameter Address = 69 Parameter Value = 0.399999976158142 Parameter Data : 0x00, 0x33, 0x33, 0x33, @@ -846,7 +855,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2RMS_MONO_TCONST -Parameter Address = 65 +Parameter Address = 71 Parameter Value = 0.000239849090576172 Parameter Data : 0x00, 0x00, 0x07, 0xDC, @@ -855,7 +864,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2threshold -Parameter Address = 64 +Parameter Address = 70 Parameter Value = 1 Parameter Data : 0x00, 0x80, 0x00, 0x00, @@ -864,7 +873,7 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2decay -Parameter Address = 66 +Parameter Address = 72 Parameter Value = 0.000244140625 Parameter Data : 0x00, 0x00, 0x08, 0x00, @@ -873,15 +882,66 @@ Parameter Data : Cell Name = Limiter 2 Parameter Name = limiterAlg2decaycomplement -Parameter Address = 67 +Parameter Address = 73 Parameter Value = 0.99951171875 Parameter Data : 0x00, 0x7F, 0xF0, 0x00, +Cell Name = Beep1 +Parameter Name = beep_freqBeepAlg1 +Parameter Address = 2 +Parameter Value = 0.00331640243530273 +Parameter Data : +0x00, 0x00, 0x6C, 0xAC, + + + +Cell Name = Beep1 +Parameter Name = enableBeepAlg1 +Parameter Address = 0 +Parameter Value = 0 +Parameter Data : +0x00, 0x00, 0x00, 0x00, + + + +Cell Name = Beep1 +Parameter Name = kickBeepAlg1 +Parameter Address = 1 +Parameter Value = 0 +Parameter Data : +0x00, 0x00, 0x00, 0x00, + + + +Cell Name = Single 1 +Parameter Name = Gain1940AlgNS7 +Parameter Address = 7 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + +Cell Name = S Splitter1 +Parameter Name = SingleCtrlSplit1 +Parameter Address = 8 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + Parameter data for: IC 1 (Hexadecimal format starting at parameter address 0) See also DigiRadio.hex file +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x6C , 0xAC , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , 0x00 , 0x80 , 0x00 , 0x00 , 0x00 , 0x80 , 0x00 , 0x00 , 0x00 , 0x80 , 0x00 , 0x00 , @@ -1900,14 +1960,14 @@ See also DigiRadio.hex file 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , -0x00 , 0x00 , 0x00 , 0x00 , -0x00 , 0x00 , 0x00 , 0x00 , -0x00 , 0x00 , 0x00 , 0x00 , -0x00 , 0x00 , 0x00 , 0x00 , -0x00 , 0x00 , 0x00 , 0x00 , -0x00 , 0x00 , 0x00 , 0x00 , Parameter data for: IC 1 (Binary format starting at parameter address 0) +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 01101100 10101100 +00000000 10000000 00000000 00000000 +00000000 10000000 00000000 00000000 +00000000 10000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000 10000000 00000000 00000000 @@ -2926,10 +2986,4 @@ Parameter data for: IC 1 (Binary format starting at parameter address 0) 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 -00000000 00000000 00000000 00000000 -00000000 00000000 00000000 00000000 -00000000 00000000 00000000 00000000 -00000000 00000000 00000000 00000000 -00000000 00000000 00000000 00000000 -00000000 00000000 00000000 00000000 diff --git a/Software/Firmware/ADAU1701-Firmware/DigiRadio.xml b/Software/Firmware/ADAU1701-Firmware/DigiRadio.xml index 0c7fd16..2f5a953 100644 --- a/Software/Firmware/ADAU1701-Firmware/DigiRadio.xml +++ b/Software/Firmware/ADAU1701-Firmware/DigiRadio.xml @@ -30,21 +30,21 @@
1024
5 5120 - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0xE8, 0x01, 0x00, 0x12, 0x00, 0x20, 0x01, 0x00, 0x30, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x01, 0x20, 0x01, 0x00, 0x38, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x02, 0x20, 0x01, 0x00, 0x40, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0x03, 0x20, 0x01, 0x00, 0x48, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x04, 0x20, 0x01, 0x00, 0x3A, 0x04, 0x40, 0x01, 0x00, 0x42, 0x05, 0x22, 0x01, 0x00, 0x4A, 0x05, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 0x00, 0xE2, 0x01, 0x01, 0x98, 0x00, 0xE4, 0x01, 0x00, 0x8A, 0x09, 0x20, 0x01, 0x00, 0x82, 0x0A, 0x22, 0x01, 0x00, 0x72, 0x09, 0x34, 0x01, 0x00, 0x6A, 0x0A, 0x22, 0x01, 0x00, 0x62, 0x06, 0x22, 0x01, 0x00, 0x5A, 0x07, 0x22, 0x01, 0x00, 0x52, 0x08, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x78, 0x00, 0xE2, 0x01, 0x00, 0x90, 0x00, 0xF2, 0x01, 0x00, 0xBA, 0x0E, 0x20, 0x01, 0x00, 0xB2, 0x0F, 0x22, 0x01, 0x00, 0xA2, 0x0E, 0x34, 0x01, 0x00, 0x9A, 0x0F, 0x22, 0x01, 0x00, 0x7A, 0x0B, 0x22, 0x01, 0x00, 0x72, 0x0C, 0x22, 0x01, 0x00, 0x6A, 0x0D, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA8, 0x00, 0xE2, 0x01, 0x00, 0xC0, 0x00, 0xF2, 0x01, 0x00, 0xEA, 0x13, 0x20, 0x01, 0x00, 0xE2, 0x14, 0x22, 0x01, 0x00, 0xD2, 0x13, 0x34, 0x01, 0x00, 0xCA, 0x14, 0x22, 0x01, 0x00, 0xAA, 0x10, 0x22, 0x01, 0x00, 0xA2, 0x11, 0x22, 0x01, 0x00, 0x9A, 0x12, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xD8, 0x00, 0xE2, 0x01, 0x00, 0xF0, 0x00, 0xF2, 0x01, 0x01, 0x1A, 0x18, 0x20, 0x01, 0x01, 0x12, 0x19, 0x22, 0x01, 0x01, 0x02, 0x18, 0x34, 0x01, 0x00, 0xFA, 0x19, 0x22, 0x01, 0x00, 0xDA, 0x15, 0x22, 0x01, 0x00, 0xD2, 0x16, 0x22, 0x01, 0x00, 0xCA, 0x17, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x08, 0x00, 0xE2, 0x01, 0x01, 0x20, 0x00, 0xF2, 0x01, 0x01, 0x4A, 0x1D, 0x20, 0x01, 0x01, 0x42, 0x1E, 0x22, 0x01, 0x01, 0x32, 0x1D, 0x34, 0x01, 0x01, 0x2A, 0x1E, 0x22, 0x01, 0x01, 0x0A, 0x1A, 0x22, 0x01, 0x01, 0x02, 0x1B, 0x22, 0x01, 0x00, 0xFA, 0x1C, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x38, 0x00, 0xE2, 0x01, 0x01, 0x50, 0x00, 0xF2, 0x01, 0x01, 0x7A, 0x22, 0x20, 0x01, 0x01, 0x72, 0x23, 0x22, 0x01, 0x01, 0x62, 0x22, 0x34, 0x01, 0x01, 0x5A, 0x23, 0x22, 0x01, 0x01, 0x3A, 0x1F, 0x22, 0x01, 0x01, 0x32, 0x20, 0x22, 0x01, 0x01, 0x2A, 0x21, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, 0x00, 0xE2, 0x01, 0x01, 0x80, 0x00, 0xF2, 0x01, 0x01, 0xC2, 0x09, 0x20, 0x01, 0x01, 0xBA, 0x0A, 0x22, 0x01, 0x01, 0xAA, 0x09, 0x34, 0x01, 0x01, 0xA2, 0x0A, 0x22, 0x01, 0x01, 0x9A, 0x06, 0x22, 0x01, 0x01, 0x92, 0x07, 0x22, 0x01, 0x01, 0x8A, 0x08, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xB0, 0x00, 0xE2, 0x01, 0x01, 0xC8, 0x00, 0xF2, 0x01, 0x01, 0xF2, 0x0E, 0x20, 0x01, 0x01, 0xEA, 0x0F, 0x22, 0x01, 0x01, 0xDA, 0x0E, 0x34, 0x01, 0x01, 0xD2, 0x0F, 0x22, 0x01, 0x01, 0xB2, 0x0B, 0x22, 0x01, 0x01, 0xAA, 0x0C, 0x22, 0x01, 0x01, 0xA2, 0x0D, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xE0, 0x00, 0xE2, 0x01, 0x01, 0xF8, 0x00, 0xF2, 0x01, 0x02, 0x22, 0x13, 0x20, 0x01, 0x02, 0x1A, 0x14, 0x22, 0x01, 0x02, 0x0A, 0x13, 0x34, 0x01, 0x02, 0x02, 0x14, 0x22, 0x01, 0x01, 0xE2, 0x10, 0x22, 0x01, 0x01, 0xDA, 0x11, 0x22, 0x01, 0x01, 0xD2, 0x12, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x10, 0x00, 0xE2, 0x01, 0x02, 0x28, 0x00, 0xF2, 0x01, 0x02, 0x52, 0x18, 0x20, 0x01, 0x02, 0x4A, 0x19, 0x22, 0x01, 0x02, 0x3A, 0x18, 0x34, 0x01, 0x02, 0x32, 0x19, 0x22, 0x01, 0x02, 0x12, 0x15, 0x22, 0x01, 0x02, 0x0A, 0x16, 0x22, 0x01, 0x02, 0x02, 0x17, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x40, 0x00, 0xE2, 0x01, 0x02, 0x58, 0x00, 0xF2, 0x01, 0x02, 0x82, 0x1D, 0x20, 0x01, 0x02, 0x7A, 0x1E, 0x22, 0x01, 0x02, 0x6A, 0x1D, 0x34, 0x01, 0x02, 0x62, 0x1E, 0x22, 0x01, 0x02, 0x42, 0x1A, 0x22, 0x01, 0x02, 0x3A, 0x1B, 0x22, 0x01, 0x02, 0x32, 0x1C, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x70, 0x00, 0xE2, 0x01, 0x02, 0x88, 0x00, 0xF2, 0x01, 0x02, 0xB2, 0x22, 0x20, 0x01, 0x02, 0xAA, 0x23, 0x22, 0x01, 0x02, 0x9A, 0x22, 0x34, 0x01, 0x02, 0x92, 0x23, 0x22, 0x01, 0x02, 0x72, 0x1F, 0x22, 0x01, 0x02, 0x6A, 0x20, 0x22, 0x01, 0x02, 0x62, 0x21, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xA0, 0x00, 0xE2, 0x01, 0x02, 0xB8, 0x00, 0xF2, 0x01, 0x01, 0x6A, 0x24, 0x20, 0x01, 0x02, 0xC0, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xA2, 0x25, 0x20, 0x01, 0x02, 0xC8, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xC1, 0x08, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x28, 0x00, 0xF0, 0x01, 0xFF, 0xE9, 0x08, 0x22, 0x01, 0x03, 0x20, 0x00, 0xF2, 0x01, 0x03, 0x11, 0x08, 0x20, 0x01, 0x03, 0x12, 0x32, 0x22, 0x41, 0x03, 0x22, 0x32, 0x22, 0x01, 0x03, 0x01, 0x08, 0x34, 0x01, 0x03, 0x02, 0x32, 0x22, 0x41, 0x03, 0x2A, 0x32, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x08, 0x00, 0xE2, 0x01, 0x03, 0x18, 0x00, 0xF2, 0x01, 0x03, 0x30, 0x00, 0xE2, 0x01, 0xFF, 0xF2, 0x2E, 0x40, 0x01, 0x03, 0x31, 0x08, 0x20, 0x09, 0x03, 0x32, 0x26, 0x20, 0x01, 0xFF, 0xF2, 0x27, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x03, 0x32, 0x28, 0x20, 0x01, 0xFF, 0xF2, 0x29, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x23, 0xFF, 0xF2, 0x2F, 0x40, 0x01, 0x03, 0x31, 0x08, 0x20, 0x09, 0x03, 0x32, 0x2A, 0x20, 0x01, 0xFF, 0xF2, 0x2B, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x23, 0xFF, 0xF2, 0x30, 0x40, 0x01, 0x03, 0x31, 0x08, 0x20, 0x09, 0x03, 0x32, 0x2C, 0x20, 0x01, 0xFF, 0xF2, 0x2D, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xD0, 0x00, 0xC0, 0x01, 0x03, 0x37, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xD7, 0xFF, 0x20, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xD0, 0x00, 0xC0, 0x01, 0x03, 0x37, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xD7, 0xFF, 0x20, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xD0, 0x00, 0xC0, 0x01, 0x03, 0x37, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xD7, 0xFF, 0x20, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xD0, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x31, 0xA0, 0x01, 0xFF, 0xE7, 0xFF, 0x20, 0x01, 0x02, 0xF8, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xF9, 0x08, 0x40, 0x01, 0xFF, 0xF1, 0x08, 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xF8, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xF9, 0x08, 0x40, 0x01, 0x02, 0xF1, 0x08, 0x20, 0x09, 0x02, 0xFA, 0x33, 0x20, 0x01, 0x02, 0xF2, 0x33, 0x22, 0x41, 0x02, 0xF1, 0x08, 0x22, 0x01, 0x02, 0xF8, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xF9, 0x08, 0x20, 0x01, 0x02, 0xE8, 0x00, 0xE2, 0x01, 0xFF, 0xF2, 0x34, 0x22, 0x49, 0xFF, 0xF1, 0x08, 0x20, 0x01, 0xFF, 0xE9, 0x08, 0x20, 0x25, 0x02, 0xE0, 0x00, 0xE2, 0x01, 0x02, 0xF8, 0x00, 0xC0, 0x01, 0x02, 0xC7, 0xFF, 0x20, 0x01, 0x02, 0xD8, 0x00, 0xE2, 0x01, 0x02, 0xC9, 0x08, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x28, 0x00, 0xF0, 0x01, 0xFF, 0xE9, 0x08, 0x22, 0x01, 0x03, 0x20, 0x00, 0xF2, 0x01, 0x03, 0x71, 0x08, 0x20, 0x01, 0x03, 0x72, 0x41, 0x22, 0x41, 0x03, 0x22, 0x41, 0x22, 0x01, 0x03, 0x61, 0x08, 0x34, 0x01, 0x03, 0x62, 0x41, 0x22, 0x41, 0x03, 0x2A, 0x41, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x68, 0x00, 0xE2, 0x01, 0x03, 0x78, 0x00, 0xF2, 0x01, 0x03, 0x30, 0x00, 0xE2, 0x01, 0xFF, 0xF2, 0x3D, 0x40, 0x01, 0x03, 0x31, 0x08, 0x20, 0x09, 0x03, 0x32, 0x35, 0x20, 0x01, 0xFF, 0xF2, 0x36, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x03, 0x32, 0x37, 0x20, 0x01, 0xFF, 0xF2, 0x38, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x23, 0xFF, 0xF2, 0x3E, 0x40, 0x01, 0x03, 0x31, 0x08, 0x20, 0x09, 0x03, 0x32, 0x39, 0x20, 0x01, 0xFF, 0xF2, 0x3A, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x23, 0xFF, 0xF2, 0x3F, 0x40, 0x01, 0x03, 0x31, 0x08, 0x20, 0x09, 0x03, 0x32, 0x3B, 0x20, 0x01, 0xFF, 0xF2, 0x3C, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xD0, 0x00, 0xC0, 0x01, 0x03, 0x37, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xD7, 0xFF, 0x20, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xD0, 0x00, 0xC0, 0x01, 0x03, 0x37, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xD7, 0xFF, 0x20, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xD0, 0x00, 0xC0, 0x01, 0x03, 0x37, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xD7, 0xFF, 0x20, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xD0, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x40, 0xA0, 0x01, 0xFF, 0xE7, 0xFF, 0x20, 0x01, 0x03, 0x58, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x59, 0x08, 0x40, 0x01, 0xFF, 0xF1, 0x08, 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x58, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x59, 0x08, 0x40, 0x01, 0x03, 0x51, 0x08, 0x20, 0x09, 0x03, 0x5A, 0x42, 0x20, 0x01, 0x03, 0x52, 0x42, 0x22, 0x41, 0x03, 0x51, 0x08, 0x22, 0x01, 0x03, 0x58, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x59, 0x08, 0x20, 0x01, 0x03, 0x48, 0x00, 0xE2, 0x01, 0xFF, 0xF2, 0x43, 0x22, 0x49, 0xFF, 0xF1, 0x08, 0x20, 0x01, 0xFF, 0xE9, 0x08, 0x20, 0x25, 0x03, 0x40, 0x00, 0xE2, 0x01, 0x03, 0x58, 0x00, 0xC0, 0x01, 0x02, 0xCF, 0xFF, 0x20, 0x01, 0x03, 0x38, 0x00, 0xE2, 0x01, 0x03, 0x39, 0x08, 0x20, 0x01, 0xFF, 0x30, 0x00, 0x02, 0x01, 0x02, 0xD9, 0x08, 0x20, 0x01, 0xFF, 0x28, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0xE8, 0x01, 0x00, 0x02, 0x01, 0xA0, 0x01, 0xFF, 0xE1, 0x07, 0x20, 0x01, 0x00, 0x38, 0x00, 0xE2, 0x01, 0x00, 0x42, 0x02, 0x20, 0x01, 0x00, 0x52, 0x00, 0x22, 0x01, 0x00, 0x58, 0x00, 0xE2, 0x01, 0x00, 0x42, 0x00, 0x20, 0x01, 0x00, 0x59, 0x08, 0x22, 0x41, 0x00, 0x39, 0x08, 0x22, 0x01, 0x00, 0x31, 0x08, 0x22, 0x41, 0x00, 0x48, 0x00, 0xE2, 0x01, 0x00, 0x12, 0x03, 0x20, 0x01, 0x00, 0x60, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x04, 0x20, 0x01, 0x00, 0x68, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x05, 0x20, 0x01, 0x00, 0x70, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0x06, 0x20, 0x01, 0x00, 0x78, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5A, 0x07, 0x20, 0x01, 0x00, 0x80, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x82, 0x08, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, 0x00, 0xE2, 0x01, 0x00, 0x82, 0x08, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x00, 0xE2, 0x01, 0x00, 0x62, 0x09, 0x20, 0x01, 0x00, 0x6A, 0x09, 0x40, 0x01, 0x00, 0x72, 0x0A, 0x22, 0x01, 0x00, 0x7A, 0x0A, 0x44, 0x01, 0x00, 0x8A, 0x0B, 0x22, 0x01, 0x00, 0x92, 0x0B, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA8, 0x00, 0xE2, 0x01, 0x01, 0xE0, 0x00, 0xE4, 0x01, 0x00, 0xD2, 0x0F, 0x20, 0x01, 0x00, 0xCA, 0x10, 0x22, 0x01, 0x00, 0xBA, 0x0F, 0x34, 0x01, 0x00, 0xB2, 0x10, 0x22, 0x01, 0x00, 0xAA, 0x0C, 0x22, 0x01, 0x00, 0xA2, 0x0D, 0x22, 0x01, 0x00, 0x9A, 0x0E, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xC0, 0x00, 0xE2, 0x01, 0x00, 0xD8, 0x00, 0xF2, 0x01, 0x01, 0x02, 0x14, 0x20, 0x01, 0x00, 0xFA, 0x15, 0x22, 0x01, 0x00, 0xEA, 0x14, 0x34, 0x01, 0x00, 0xE2, 0x15, 0x22, 0x01, 0x00, 0xC2, 0x11, 0x22, 0x01, 0x00, 0xBA, 0x12, 0x22, 0x01, 0x00, 0xB2, 0x13, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xF0, 0x00, 0xE2, 0x01, 0x01, 0x08, 0x00, 0xF2, 0x01, 0x01, 0x32, 0x19, 0x20, 0x01, 0x01, 0x2A, 0x1A, 0x22, 0x01, 0x01, 0x1A, 0x19, 0x34, 0x01, 0x01, 0x12, 0x1A, 0x22, 0x01, 0x00, 0xF2, 0x16, 0x22, 0x01, 0x00, 0xEA, 0x17, 0x22, 0x01, 0x00, 0xE2, 0x18, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x00, 0xE2, 0x01, 0x01, 0x38, 0x00, 0xF2, 0x01, 0x01, 0x62, 0x1E, 0x20, 0x01, 0x01, 0x5A, 0x1F, 0x22, 0x01, 0x01, 0x4A, 0x1E, 0x34, 0x01, 0x01, 0x42, 0x1F, 0x22, 0x01, 0x01, 0x22, 0x1B, 0x22, 0x01, 0x01, 0x1A, 0x1C, 0x22, 0x01, 0x01, 0x12, 0x1D, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x50, 0x00, 0xE2, 0x01, 0x01, 0x68, 0x00, 0xF2, 0x01, 0x01, 0x92, 0x23, 0x20, 0x01, 0x01, 0x8A, 0x24, 0x22, 0x01, 0x01, 0x7A, 0x23, 0x34, 0x01, 0x01, 0x72, 0x24, 0x22, 0x01, 0x01, 0x52, 0x20, 0x22, 0x01, 0x01, 0x4A, 0x21, 0x22, 0x01, 0x01, 0x42, 0x22, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x80, 0x00, 0xE2, 0x01, 0x01, 0x98, 0x00, 0xF2, 0x01, 0x01, 0xC2, 0x28, 0x20, 0x01, 0x01, 0xBA, 0x29, 0x22, 0x01, 0x01, 0xAA, 0x28, 0x34, 0x01, 0x01, 0xA2, 0x29, 0x22, 0x01, 0x01, 0x82, 0x25, 0x22, 0x01, 0x01, 0x7A, 0x26, 0x22, 0x01, 0x01, 0x72, 0x27, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xB0, 0x00, 0xE2, 0x01, 0x01, 0xC8, 0x00, 0xF2, 0x01, 0x02, 0x0A, 0x0F, 0x20, 0x01, 0x02, 0x02, 0x10, 0x22, 0x01, 0x01, 0xF2, 0x0F, 0x34, 0x01, 0x01, 0xEA, 0x10, 0x22, 0x01, 0x01, 0xE2, 0x0C, 0x22, 0x01, 0x01, 0xDA, 0x0D, 0x22, 0x01, 0x01, 0xD2, 0x0E, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xF8, 0x00, 0xE2, 0x01, 0x02, 0x10, 0x00, 0xF2, 0x01, 0x02, 0x3A, 0x14, 0x20, 0x01, 0x02, 0x32, 0x15, 0x22, 0x01, 0x02, 0x22, 0x14, 0x34, 0x01, 0x02, 0x1A, 0x15, 0x22, 0x01, 0x01, 0xFA, 0x11, 0x22, 0x01, 0x01, 0xF2, 0x12, 0x22, 0x01, 0x01, 0xEA, 0x13, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x28, 0x00, 0xE2, 0x01, 0x02, 0x40, 0x00, 0xF2, 0x01, 0x02, 0x6A, 0x19, 0x20, 0x01, 0x02, 0x62, 0x1A, 0x22, 0x01, 0x02, 0x52, 0x19, 0x34, 0x01, 0x02, 0x4A, 0x1A, 0x22, 0x01, 0x02, 0x2A, 0x16, 0x22, 0x01, 0x02, 0x22, 0x17, 0x22, 0x01, 0x02, 0x1A, 0x18, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0xE2, 0x01, 0x02, 0x70, 0x00, 0xF2, 0x01, 0x02, 0x9A, 0x1E, 0x20, 0x01, 0x02, 0x92, 0x1F, 0x22, 0x01, 0x02, 0x82, 0x1E, 0x34, 0x01, 0x02, 0x7A, 0x1F, 0x22, 0x01, 0x02, 0x5A, 0x1B, 0x22, 0x01, 0x02, 0x52, 0x1C, 0x22, 0x01, 0x02, 0x4A, 0x1D, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x88, 0x00, 0xE2, 0x01, 0x02, 0xA0, 0x00, 0xF2, 0x01, 0x02, 0xCA, 0x23, 0x20, 0x01, 0x02, 0xC2, 0x24, 0x22, 0x01, 0x02, 0xB2, 0x23, 0x34, 0x01, 0x02, 0xAA, 0x24, 0x22, 0x01, 0x02, 0x8A, 0x20, 0x22, 0x01, 0x02, 0x82, 0x21, 0x22, 0x01, 0x02, 0x7A, 0x22, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xB8, 0x00, 0xE2, 0x01, 0x02, 0xD0, 0x00, 0xF2, 0x01, 0x02, 0xFA, 0x28, 0x20, 0x01, 0x02, 0xF2, 0x29, 0x22, 0x01, 0x02, 0xE2, 0x28, 0x34, 0x01, 0x02, 0xDA, 0x29, 0x22, 0x01, 0x02, 0xBA, 0x25, 0x22, 0x01, 0x02, 0xB2, 0x26, 0x22, 0x01, 0x02, 0xAA, 0x27, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xE8, 0x00, 0xE2, 0x01, 0x03, 0x00, 0x00, 0xF2, 0x01, 0x01, 0xB2, 0x2A, 0x20, 0x01, 0x03, 0x08, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xEA, 0x2B, 0x20, 0x01, 0x03, 0x10, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x09, 0x08, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x70, 0x00, 0xF0, 0x01, 0xFF, 0xE9, 0x08, 0x22, 0x01, 0x03, 0x68, 0x00, 0xF2, 0x01, 0x03, 0x59, 0x08, 0x20, 0x01, 0x03, 0x5A, 0x38, 0x22, 0x41, 0x03, 0x6A, 0x38, 0x22, 0x01, 0x03, 0x49, 0x08, 0x34, 0x01, 0x03, 0x4A, 0x38, 0x22, 0x41, 0x03, 0x72, 0x38, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x50, 0x00, 0xE2, 0x01, 0x03, 0x60, 0x00, 0xF2, 0x01, 0x03, 0x78, 0x00, 0xE2, 0x01, 0xFF, 0xF2, 0x34, 0x40, 0x01, 0x03, 0x79, 0x08, 0x20, 0x09, 0x03, 0x7A, 0x2C, 0x20, 0x01, 0xFF, 0xF2, 0x2D, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x7A, 0x2E, 0x20, 0x01, 0xFF, 0xF2, 0x2F, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x23, 0xFF, 0xF2, 0x35, 0x40, 0x01, 0x03, 0x79, 0x08, 0x20, 0x09, 0x03, 0x7A, 0x30, 0x20, 0x01, 0xFF, 0xF2, 0x31, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x23, 0xFF, 0xF2, 0x36, 0x40, 0x01, 0x03, 0x79, 0x08, 0x20, 0x09, 0x03, 0x7A, 0x32, 0x20, 0x01, 0xFF, 0xF2, 0x33, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x18, 0x00, 0xC0, 0x01, 0x03, 0x7F, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x1F, 0xFF, 0x20, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x18, 0x00, 0xC0, 0x01, 0x03, 0x7F, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x1F, 0xFF, 0x20, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x18, 0x00, 0xC0, 0x01, 0x03, 0x7F, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x1F, 0xFF, 0x20, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x18, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x37, 0xA0, 0x01, 0xFF, 0xE7, 0xFF, 0x20, 0x01, 0x03, 0x40, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x41, 0x08, 0x40, 0x01, 0xFF, 0xF1, 0x08, 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x40, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x41, 0x08, 0x40, 0x01, 0x03, 0x39, 0x08, 0x20, 0x09, 0x03, 0x42, 0x39, 0x20, 0x01, 0x03, 0x3A, 0x39, 0x22, 0x41, 0x03, 0x39, 0x08, 0x22, 0x01, 0x03, 0x40, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x41, 0x08, 0x20, 0x01, 0x03, 0x30, 0x00, 0xE2, 0x01, 0xFF, 0xF2, 0x3A, 0x22, 0x49, 0xFF, 0xF1, 0x08, 0x20, 0x01, 0xFF, 0xE9, 0x08, 0x20, 0x25, 0x03, 0x28, 0x00, 0xE2, 0x01, 0x03, 0x40, 0x00, 0xC0, 0x01, 0x03, 0x0F, 0xFF, 0x20, 0x01, 0x03, 0x20, 0x00, 0xE2, 0x01, 0x03, 0x11, 0x08, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x70, 0x00, 0xF0, 0x01, 0xFF, 0xE9, 0x08, 0x22, 0x01, 0x03, 0x68, 0x00, 0xF2, 0x01, 0x03, 0xB9, 0x08, 0x20, 0x01, 0x03, 0xBA, 0x47, 0x22, 0x41, 0x03, 0x6A, 0x47, 0x22, 0x01, 0x03, 0xA9, 0x08, 0x34, 0x01, 0x03, 0xAA, 0x47, 0x22, 0x41, 0x03, 0x72, 0x47, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0xB0, 0x00, 0xE2, 0x01, 0x03, 0xC0, 0x00, 0xF2, 0x01, 0x03, 0x78, 0x00, 0xE2, 0x01, 0xFF, 0xF2, 0x43, 0x40, 0x01, 0x03, 0x79, 0x08, 0x20, 0x09, 0x03, 0x7A, 0x3B, 0x20, 0x01, 0xFF, 0xF2, 0x3C, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x7A, 0x3D, 0x20, 0x01, 0xFF, 0xF2, 0x3E, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x23, 0xFF, 0xF2, 0x44, 0x40, 0x01, 0x03, 0x79, 0x08, 0x20, 0x09, 0x03, 0x7A, 0x3F, 0x20, 0x01, 0xFF, 0xF2, 0x40, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x23, 0xFF, 0xF2, 0x45, 0x40, 0x01, 0x03, 0x79, 0x08, 0x20, 0x09, 0x03, 0x7A, 0x41, 0x20, 0x01, 0xFF, 0xF2, 0x42, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x18, 0x00, 0xC0, 0x01, 0x03, 0x7F, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x1F, 0xFF, 0x20, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x18, 0x00, 0xC0, 0x01, 0x03, 0x7F, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x1F, 0xFF, 0x20, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x18, 0x00, 0xC0, 0x01, 0x03, 0x7F, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x1F, 0xFF, 0x20, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0x03, 0x18, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x46, 0xA0, 0x01, 0xFF, 0xE7, 0xFF, 0x20, 0x01, 0x03, 0xA0, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0xA1, 0x08, 0x40, 0x01, 0xFF, 0xF1, 0x08, 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0xA0, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0xA1, 0x08, 0x40, 0x01, 0x03, 0x99, 0x08, 0x20, 0x09, 0x03, 0xA2, 0x48, 0x20, 0x01, 0x03, 0x9A, 0x48, 0x22, 0x41, 0x03, 0x99, 0x08, 0x22, 0x01, 0x03, 0xA0, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0xA1, 0x08, 0x20, 0x01, 0x03, 0x90, 0x00, 0xE2, 0x01, 0xFF, 0xF2, 0x49, 0x22, 0x49, 0xFF, 0xF1, 0x08, 0x20, 0x01, 0xFF, 0xE9, 0x08, 0x20, 0x25, 0x03, 0x88, 0x00, 0xE2, 0x01, 0x03, 0xA0, 0x00, 0xC0, 0x01, 0x03, 0x17, 0xFF, 0x20, 0x01, 0x03, 0x80, 0x00, 0xE2, 0x01, 0x03, 0x81, 0x08, 0x20, 0x01, 0xFF, 0x30, 0x00, 0x02, 0x01, 0x03, 0x21, 0x08, 0x20, 0x01, 0xFF, 0x28, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, Param
0
4 4096 - 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xC3, 0x65, 0x0F, 0x00, 0x79, 0x35, 0x00, 0x7F, 0xC3, 0x65, 0x00, 0xFF, 0x86, 0xAE, 0x0F, 0x80, 0x79, 0x19, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0F, 0xFE, 0x2B, 0xE3, 0x00, 0x22, 0xBE, 0x2C, 0x0F, 0xEA, 0xAA, 0xAB, 0x00, 0x6A, 0xAA, 0xAB, 0x0F, 0x9A, 0x69, 0xA7, 0x00, 0xFD, 0xF7, 0xDF, 0x08, 0x3C, 0x6C, 0x20, 0x03, 0xF5, 0xAA, 0x23, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x0F, 0xFE, 0x2B, 0xE3, 0x00, 0x22, 0xBE, 0x2C, 0x0F, 0xEA, 0xAA, 0xAB, 0x00, 0x6A, 0xAA, 0xAB, 0x0F, 0x9A, 0x69, 0xA7, 0x00, 0xFD, 0xF7, 0xDF, 0x08, 0x3C, 0x6C, 0x20, 0x03, 0xF5, 0xAA, 0x23, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xAC, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xC3, 0x65, 0x0F, 0x00, 0x79, 0x35, 0x00, 0x7F, 0xC3, 0x65, 0x00, 0xFF, 0x86, 0xAE, 0x0F, 0x80, 0x79, 0x19, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0F, 0xFE, 0x2B, 0xE3, 0x00, 0x22, 0xBE, 0x2C, 0x0F, 0xEA, 0xAA, 0xAB, 0x00, 0x6A, 0xAA, 0xAB, 0x0F, 0x9A, 0x69, 0xA7, 0x00, 0xFD, 0xF7, 0xDF, 0x08, 0x3C, 0x6C, 0x20, 0x03, 0xF5, 0xAA, 0x23, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x0F, 0xFE, 0x2B, 0xE3, 0x00, 0x22, 0xBE, 0x2C, 0x0F, 0xEA, 0xAA, 0xAB, 0x00, 0x6A, 0xAA, 0xAB, 0x0F, 0x9A, 0x69, 0xA7, 0x00, 0xFD, 0xF7, 0xDF, 0x08, 0x3C, 0x6C, 0x20, 0x03, 0xF5, 0xAA, 0x23, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
IC 1.HWConFiguration
2076
0 24 - 0x00, 0x18, 0x08, 0x08, 0x00, 0x00, 0x44, 0x00, 0x44, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x18, 0x0B, 0x08, 0x00, 0x00, 0x44, 0x00, 0x44, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
IC 1.CoreRegister @@ -62,7 +62,7 @@ Gain1940AlgNS1 FixedPoint -
0
+
3
1 4 0x00, 0x80, 0x00, 0x00, @@ -75,7 +75,7 @@ Gain1940AlgNS2 FixedPoint -
1
+
4
1 4 0x00, 0x80, 0x00, 0x00, @@ -91,7 +91,7 @@ Gain1940AlgNS3 FixedPoint -
2
+
5
1 4 0x00, 0x80, 0x00, 0x00, @@ -104,7 +104,7 @@ Gain1940AlgNS4 FixedPoint -
3
+
6
1 4 0x00, 0x80, 0x00, 0x00, @@ -116,11 +116,11 @@ ALG0 StereoMixerAlg1 - Stereo Mixer( 2 ) : Gain`max[ 6 ],Gain`min[ -30 ],Gain`res[ 36 ],Gain[ 0 ];Gain`max[ 6 ],Gain`min[ -30 ],Gain`res[ 36 ],Gain[ 0 ]; + Stereo Mixer( 3 ) : Gain`max[ 6 ],Gain`min[ -30 ],Gain`res[ 36 ],Gain[ 0 ];Gain`max[ 6 ],Gain`min[ -30 ],Gain`res[ 36 ],Gain[ 0 ];Gain`max[ 6 ],Gain`min[ -30 ],Gain`res[ 36 ],Gain[ 0 ]; StereoMixerAlg12 FixedPoint -
4
+
9
1 4 0x00, 0x80, 0x00, 0x00, @@ -128,7 +128,15 @@ StereoMixerAlg14 FixedPoint -
5
+
10
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + StereoMixerAlg16 + FixedPoint +
11
1 4 0x00, 0x80, 0x00, 0x00, @@ -144,7 +152,7 @@ PEQ1Chan10B1 FixedPoint -
6
+
12
0.99815046787262 4 0x00, 0x7F, 0xC3, 0x65, @@ -152,7 +160,7 @@ PEQ1Chan10B1 FixedPoint -
6
+
12
0.99815046787262 4 0x00, 0x7F, 0xC3, 0x65, @@ -160,7 +168,7 @@ PEQ1Chan11B1 FixedPoint -
7
+
13
-1.99630105495453 4 0x0F, 0x00, 0x79, 0x35, @@ -168,7 +176,7 @@ PEQ1Chan11B1 FixedPoint -
7
+
13
-1.99630105495453 4 0x0F, 0x00, 0x79, 0x35, @@ -176,7 +184,7 @@ PEQ1Chan12B1 FixedPoint -
8
+
14
0.99815046787262 4 0x00, 0x7F, 0xC3, 0x65, @@ -184,7 +192,7 @@ PEQ1Chan12B1 FixedPoint -
8
+
14
0.99815046787262 4 0x00, 0x7F, 0xC3, 0x65, @@ -192,7 +200,7 @@ PEQ1Chan11A1 FixedPoint -
9
+
15
1.99629759788513 4 0x00, 0xFF, 0x86, 0xAE, @@ -200,7 +208,7 @@ PEQ1Chan11A1 FixedPoint -
9
+
15
1.99629759788513 4 0x00, 0xFF, 0x86, 0xAE, @@ -208,7 +216,7 @@ PEQ1Chan12A1 FixedPoint -
10
+
16
-0.996304392814636 4 0x0F, 0x80, 0x79, 0x19, @@ -216,7 +224,7 @@ PEQ1Chan12A1 FixedPoint -
10
+
16
-0.996304392814636 4 0x0F, 0x80, 0x79, 0x19, @@ -224,7 +232,7 @@ PEQ1Chan10B2 FixedPoint -
11
+
17
1 4 0x00, 0x80, 0x00, 0x00, @@ -232,7 +240,7 @@ PEQ1Chan10B2 FixedPoint -
11
+
17
1 4 0x00, 0x80, 0x00, 0x00, @@ -240,7 +248,7 @@ PEQ1Chan11B2 FixedPoint -
12
+
18
0 4 0x00, 0x00, 0x00, 0x00, @@ -248,7 +256,7 @@ PEQ1Chan11B2 FixedPoint -
12
+
18
0 4 0x00, 0x00, 0x00, 0x00, @@ -256,7 +264,7 @@ PEQ1Chan12B2 FixedPoint -
13
+
19
0 4 0x00, 0x00, 0x00, 0x00, @@ -264,7 +272,7 @@ PEQ1Chan12B2 FixedPoint -
13
+
19
0 4 0x00, 0x00, 0x00, 0x00, @@ -272,7 +280,7 @@ PEQ1Chan11A2 FixedPoint -
14
+
20
0 4 0x00, 0x00, 0x00, 0x00, @@ -280,7 +288,7 @@ PEQ1Chan11A2 FixedPoint -
14
+
20
0 4 0x00, 0x00, 0x00, 0x00, @@ -288,7 +296,7 @@ PEQ1Chan12A2 FixedPoint -
15
+
21
0 4 0x00, 0x00, 0x00, 0x00, @@ -296,7 +304,7 @@ PEQ1Chan12A2 FixedPoint -
15
+
21
0 4 0x00, 0x00, 0x00, 0x00, @@ -304,7 +312,7 @@ PEQ1Chan10B3 FixedPoint -
16
+
22
1 4 0x00, 0x80, 0x00, 0x00, @@ -312,7 +320,7 @@ PEQ1Chan10B3 FixedPoint -
16
+
22
1 4 0x00, 0x80, 0x00, 0x00, @@ -320,7 +328,7 @@ PEQ1Chan11B3 FixedPoint -
17
+
23
0 4 0x00, 0x00, 0x00, 0x00, @@ -328,7 +336,7 @@ PEQ1Chan11B3 FixedPoint -
17
+
23
0 4 0x00, 0x00, 0x00, 0x00, @@ -336,7 +344,7 @@ PEQ1Chan12B3 FixedPoint -
18
+
24
0 4 0x00, 0x00, 0x00, 0x00, @@ -344,7 +352,7 @@ PEQ1Chan12B3 FixedPoint -
18
+
24
0 4 0x00, 0x00, 0x00, 0x00, @@ -352,7 +360,7 @@ PEQ1Chan11A3 FixedPoint -
19
+
25
0 4 0x00, 0x00, 0x00, 0x00, @@ -360,7 +368,7 @@ PEQ1Chan11A3 FixedPoint -
19
+
25
0 4 0x00, 0x00, 0x00, 0x00, @@ -368,7 +376,7 @@ PEQ1Chan12A3 FixedPoint -
20
+
26
0 4 0x00, 0x00, 0x00, 0x00, @@ -376,7 +384,7 @@ PEQ1Chan12A3 FixedPoint -
20
+
26
0 4 0x00, 0x00, 0x00, 0x00, @@ -384,7 +392,7 @@ PEQ1Chan10B4 FixedPoint -
21
+
27
1 4 0x00, 0x80, 0x00, 0x00, @@ -392,7 +400,7 @@ PEQ1Chan10B4 FixedPoint -
21
+
27
1 4 0x00, 0x80, 0x00, 0x00, @@ -400,7 +408,7 @@ PEQ1Chan11B4 FixedPoint -
22
+
28
0 4 0x00, 0x00, 0x00, 0x00, @@ -408,7 +416,7 @@ PEQ1Chan11B4 FixedPoint -
22
+
28
0 4 0x00, 0x00, 0x00, 0x00, @@ -416,7 +424,7 @@ PEQ1Chan12B4 FixedPoint -
23
+
29
0 4 0x00, 0x00, 0x00, 0x00, @@ -424,7 +432,7 @@ PEQ1Chan12B4 FixedPoint -
23
+
29
0 4 0x00, 0x00, 0x00, 0x00, @@ -432,7 +440,7 @@ PEQ1Chan11A4 FixedPoint -
24
+
30
0 4 0x00, 0x00, 0x00, 0x00, @@ -440,7 +448,7 @@ PEQ1Chan11A4 FixedPoint -
24
+
30
0 4 0x00, 0x00, 0x00, 0x00, @@ -448,7 +456,7 @@ PEQ1Chan12A4 FixedPoint -
25
+
31
0 4 0x00, 0x00, 0x00, 0x00, @@ -456,7 +464,7 @@ PEQ1Chan12A4 FixedPoint -
25
+
31
0 4 0x00, 0x00, 0x00, 0x00, @@ -464,7 +472,7 @@ PEQ1Chan10B5 FixedPoint -
26
+
32
1 4 0x00, 0x80, 0x00, 0x00, @@ -472,7 +480,7 @@ PEQ1Chan10B5 FixedPoint -
26
+
32
1 4 0x00, 0x80, 0x00, 0x00, @@ -480,7 +488,7 @@ PEQ1Chan11B5 FixedPoint -
27
+
33
0 4 0x00, 0x00, 0x00, 0x00, @@ -488,7 +496,7 @@ PEQ1Chan11B5 FixedPoint -
27
+
33
0 4 0x00, 0x00, 0x00, 0x00, @@ -496,7 +504,7 @@ PEQ1Chan12B5 FixedPoint -
28
+
34
0 4 0x00, 0x00, 0x00, 0x00, @@ -504,7 +512,7 @@ PEQ1Chan12B5 FixedPoint -
28
+
34
0 4 0x00, 0x00, 0x00, 0x00, @@ -512,7 +520,7 @@ PEQ1Chan11A5 FixedPoint -
29
+
35
0 4 0x00, 0x00, 0x00, 0x00, @@ -520,7 +528,7 @@ PEQ1Chan11A5 FixedPoint -
29
+
35
0 4 0x00, 0x00, 0x00, 0x00, @@ -528,7 +536,7 @@ PEQ1Chan12A5 FixedPoint -
30
+
36
0 4 0x00, 0x00, 0x00, 0x00, @@ -536,7 +544,7 @@ PEQ1Chan12A5 FixedPoint -
30
+
36
0 4 0x00, 0x00, 0x00, 0x00, @@ -544,7 +552,7 @@ PEQ1Chan10B6 FixedPoint -
31
+
37
1 4 0x00, 0x80, 0x00, 0x00, @@ -552,7 +560,7 @@ PEQ1Chan10B6 FixedPoint -
31
+
37
1 4 0x00, 0x80, 0x00, 0x00, @@ -560,7 +568,7 @@ PEQ1Chan11B6 FixedPoint -
32
+
38
0 4 0x00, 0x00, 0x00, 0x00, @@ -568,7 +576,7 @@ PEQ1Chan11B6 FixedPoint -
32
+
38
0 4 0x00, 0x00, 0x00, 0x00, @@ -576,7 +584,7 @@ PEQ1Chan12B6 FixedPoint -
33
+
39
0 4 0x00, 0x00, 0x00, 0x00, @@ -584,7 +592,7 @@ PEQ1Chan12B6 FixedPoint -
33
+
39
0 4 0x00, 0x00, 0x00, 0x00, @@ -592,7 +600,7 @@ PEQ1Chan11A6 FixedPoint -
34
+
40
0 4 0x00, 0x00, 0x00, 0x00, @@ -600,7 +608,7 @@ PEQ1Chan11A6 FixedPoint -
34
+
40
0 4 0x00, 0x00, 0x00, 0x00, @@ -608,7 +616,7 @@ PEQ1Chan12A6 FixedPoint -
35
+
41
0 4 0x00, 0x00, 0x00, 0x00, @@ -616,7 +624,7 @@ PEQ1Chan12A6 FixedPoint -
35
+
41
0 4 0x00, 0x00, 0x00, 0x00, @@ -632,7 +640,7 @@ Gain1940AlgNS5 FixedPoint -
36
+
42
1 4 0x00, 0x80, 0x00, 0x00, @@ -645,7 +653,7 @@ Gain1940AlgNS6 FixedPoint -
37
+
43
1 4 0x00, 0x80, 0x00, 0x00, @@ -661,7 +669,7 @@ limiterAlg1slope_1 FixedPoint -
38
+
44
-0.014285683631897 4 0x0F, 0xFE, 0x2B, 0xE3, @@ -669,7 +677,7 @@ limiterAlg1inter_1 FixedPoint -
39
+
45
0.27142858505249 4 0x00, 0x22, 0xBE, 0x2C, @@ -677,7 +685,7 @@ limiterAlg1slope_2 FixedPoint -
40
+
46
-0.166666626930237 4 0x0F, 0xEA, 0xAA, 0xAB, @@ -685,7 +693,7 @@ limiterAlg1inter_2 FixedPoint -
41
+
47
0.833333373069763 4 0x00, 0x6A, 0xAA, 0xAB, @@ -693,7 +701,7 @@ limiterAlg1slope_3 FixedPoint -
42
+
48
-0.79365074634552 4 0x0F, 0x9A, 0x69, 0xA7, @@ -701,7 +709,7 @@ limiterAlg1inter_3 FixedPoint -
43
+
49
1.98412692546844 4 0x00, 0xFD, 0xF7, 0xDF, @@ -709,7 +717,7 @@ limiterAlg1slope_4 FixedPoint -
44
+
50
-15.5279502868652 4 0x08, 0x3C, 0x6C, 0x20, @@ -717,7 +725,7 @@ limiterAlg1inter_4 FixedPoint -
45
+
51
7.91925466060638 4 0x03, 0xF5, 0xAA, 0x23, @@ -725,7 +733,7 @@ limiterAlg1comp1 FixedPoint -
46
+
52
3 4 0x01, 0x80, 0x00, 0x00, @@ -733,7 +741,7 @@ limiterAlg1comp2 FixedPoint -
47
+
53
2 4 0x01, 0x00, 0x00, 0x00, @@ -741,7 +749,7 @@ limiterAlg1comp3 FixedPoint -
48
+
54
0.399999976158142 4 0x00, 0x33, 0x33, 0x33, @@ -749,7 +757,7 @@ limiterAlg1threshold FixedPoint -
49
+
55
1 4 0x00, 0x80, 0x00, 0x00, @@ -757,7 +765,7 @@ limiterAlg1RMS_MONO_TCONST FixedPoint -
50
+
56
0.000239849090576172 4 0x00, 0x00, 0x07, 0xDC, @@ -765,7 +773,7 @@ limiterAlg1decay FixedPoint -
51
+
57
0.000244140625 4 0x00, 0x00, 0x08, 0x00, @@ -773,7 +781,7 @@ limiterAlg1decaycomplement FixedPoint -
52
+
58
0.99951171875 4 0x00, 0x7F, 0xF0, 0x00, @@ -789,7 +797,7 @@ limiterAlg2slope_1 FixedPoint -
53
+
59
-0.014285683631897 4 0x0F, 0xFE, 0x2B, 0xE3, @@ -797,7 +805,7 @@ limiterAlg2inter_1 FixedPoint -
54
+
60
0.27142858505249 4 0x00, 0x22, 0xBE, 0x2C, @@ -805,7 +813,7 @@ limiterAlg2slope_2 FixedPoint -
55
+
61
-0.166666626930237 4 0x0F, 0xEA, 0xAA, 0xAB, @@ -813,7 +821,7 @@ limiterAlg2inter_2 FixedPoint -
56
+
62
0.833333373069763 4 0x00, 0x6A, 0xAA, 0xAB, @@ -821,7 +829,7 @@ limiterAlg2slope_3 FixedPoint -
57
+
63
-0.79365074634552 4 0x0F, 0x9A, 0x69, 0xA7, @@ -829,7 +837,7 @@ limiterAlg2inter_3 FixedPoint -
58
+
64
1.98412692546844 4 0x00, 0xFD, 0xF7, 0xDF, @@ -837,7 +845,7 @@ limiterAlg2slope_4 FixedPoint -
59
+
65
-15.5279502868652 4 0x08, 0x3C, 0x6C, 0x20, @@ -845,7 +853,7 @@ limiterAlg2inter_4 FixedPoint -
60
+
66
7.91925466060638 4 0x03, 0xF5, 0xAA, 0x23, @@ -853,7 +861,7 @@ limiterAlg2comp1 FixedPoint -
61
+
67
3 4 0x01, 0x80, 0x00, 0x00, @@ -861,7 +869,7 @@ limiterAlg2comp2 FixedPoint -
62
+
68
2 4 0x01, 0x00, 0x00, 0x00, @@ -869,7 +877,7 @@ limiterAlg2comp3 FixedPoint -
63
+
69
0.399999976158142 4 0x00, 0x33, 0x33, 0x33, @@ -877,7 +885,7 @@ limiterAlg2threshold FixedPoint -
64
+
70
1 4 0x00, 0x80, 0x00, 0x00, @@ -885,7 +893,7 @@ limiterAlg2RMS_MONO_TCONST FixedPoint -
65
+
71
0.000239849090576172 4 0x00, 0x00, 0x07, 0xDC, @@ -893,7 +901,7 @@ limiterAlg2decay FixedPoint -
66
+
72
0.000244140625 4 0x00, 0x00, 0x08, 0x00, @@ -901,12 +909,76 @@ limiterAlg2decaycomplement FixedPoint -
67
+
73
0.99951171875 4 0x00, 0x7F, 0xF0, 0x00,
+ + Beep1 + + ALG0 + BeepAlg1 + Beep - variable gain( 1 ) : Frequency[ 440 ]; + + enableBeepAlg1 + FixedPoint +
0
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + kickBeepAlg1 + FixedPoint +
1
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + beep_freqBeepAlg1 + FixedPoint +
2
+ 0.00331640243530273 + 4 + 0x00, 0x00, 0x6C, 0xAC, +
+
+
+ + Single 1 + + ALG0 + Gain1940AlgNS7 + Gain (no slew)( 1 ) : Gain`max[ 0 ],Gain`min[ -80 ],Gain`res[ 40 ],Gain[ 0 ]; + + Gain1940AlgNS7 + FixedPoint +
7
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+
+
+ + S Splitter1 + + ALG0 + SingleCtrlSplit1 + Splitter Single( 1 ) : Gain`max[ 8 ],Gain`min[ -40 ],Gain`res[ 48 ],Gain[ 0 ]; + + SingleCtrlSplit1 + FixedPoint +
8
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+
+
\ No newline at end of file diff --git a/Software/Firmware/ADAU1701-Firmware/DigiRadio_IC_1.h b/Software/Firmware/ADAU1701-Firmware/DigiRadio_IC_1.h index 9db41dc..502be37 100644 --- a/Software/Firmware/ADAU1701-Firmware/DigiRadio_IC_1.h +++ b/Software/Firmware/ADAU1701-Firmware/DigiRadio_IC_1.h @@ -1,7 +1,7 @@ /* - * File: C:\Users\mikbi\Documents\Allegati\Desktop\DigiRadio\DigiRadio_IC_1.h + * File: C:\Users\mikbi\Documents\Allegati\Desktop\DigiRadio\DigiRadioModificato\DigiRadio_IC_1.h * - * Created: Monday, July 6, 2026 2:41:28 PM + * Created: Friday, August 7, 2026 3:19:11 AM * Description: DigiRadio:IC 1 program data. * * This software is distributed in the hope that it will be useful, @@ -23,7 +23,7 @@ #include "DigiRadio_IC_1_REG.h" #define DEVICE_ARCHITECTURE_IC_1 "ADAU1701" -#define DEVICE_ADDR_IC_1 0x68 +#define DEVICE_ADDR_IC_1 0x1 /* DSP Program Data */ #define PROGRAM_SIZE_IC_1 5120 @@ -41,310 +41,332 @@ ADI_REG_TYPE Program_Data_IC_1[PROGRAM_SIZE_IC_1] = { 0x00, 0x20, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0xE8, 0x01, -0x00, 0x12, 0x00, 0x20, 0x01, -0x00, 0x30, 0x00, 0xE2, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x1A, 0x01, 0x20, 0x01, +0x00, 0x02, 0x01, 0xA0, 0x01, +0xFF, 0xE1, 0x07, 0x20, 0x01, 0x00, 0x38, 0x00, 0xE2, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x22, 0x02, 0x20, 0x01, -0x00, 0x40, 0x00, 0xE2, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x2A, 0x03, 0x20, 0x01, +0x00, 0x42, 0x02, 0x20, 0x01, +0x00, 0x52, 0x00, 0x22, 0x01, +0x00, 0x58, 0x00, 0xE2, 0x01, +0x00, 0x42, 0x00, 0x20, 0x01, +0x00, 0x59, 0x08, 0x22, 0x41, +0x00, 0x39, 0x08, 0x22, 0x01, +0x00, 0x31, 0x08, 0x22, 0x41, 0x00, 0x48, 0x00, 0xE2, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x32, 0x04, 0x20, 0x01, -0x00, 0x3A, 0x04, 0x40, 0x01, -0x00, 0x42, 0x05, 0x22, 0x01, -0x00, 0x4A, 0x05, 0x44, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x12, 0x03, 0x20, 0x01, 0x00, 0x60, 0x00, 0xE2, 0x01, -0x01, 0x98, 0x00, 0xE4, 0x01, -0x00, 0x8A, 0x09, 0x20, 0x01, -0x00, 0x82, 0x0A, 0x22, 0x01, -0x00, 0x72, 0x09, 0x34, 0x01, -0x00, 0x6A, 0x0A, 0x22, 0x01, -0x00, 0x62, 0x06, 0x22, 0x01, -0x00, 0x5A, 0x07, 0x22, 0x01, -0x00, 0x52, 0x08, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x1A, 0x04, 0x20, 0x01, +0x00, 0x68, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x22, 0x05, 0x20, 0x01, +0x00, 0x70, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x2A, 0x06, 0x20, 0x01, 0x00, 0x78, 0x00, 0xE2, 0x01, -0x00, 0x90, 0x00, 0xF2, 0x01, -0x00, 0xBA, 0x0E, 0x20, 0x01, -0x00, 0xB2, 0x0F, 0x22, 0x01, -0x00, 0xA2, 0x0E, 0x34, 0x01, -0x00, 0x9A, 0x0F, 0x22, 0x01, -0x00, 0x7A, 0x0B, 0x22, 0x01, -0x00, 0x72, 0x0C, 0x22, 0x01, -0x00, 0x6A, 0x0D, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x5A, 0x07, 0x20, 0x01, +0x00, 0x80, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x82, 0x08, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x88, 0x00, 0xE2, 0x01, +0x00, 0x82, 0x08, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x90, 0x00, 0xE2, 0x01, +0x00, 0x62, 0x09, 0x20, 0x01, +0x00, 0x6A, 0x09, 0x40, 0x01, +0x00, 0x72, 0x0A, 0x22, 0x01, +0x00, 0x7A, 0x0A, 0x44, 0x01, +0x00, 0x8A, 0x0B, 0x22, 0x01, +0x00, 0x92, 0x0B, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA8, 0x00, 0xE2, 0x01, -0x00, 0xC0, 0x00, 0xF2, 0x01, -0x00, 0xEA, 0x13, 0x20, 0x01, -0x00, 0xE2, 0x14, 0x22, 0x01, -0x00, 0xD2, 0x13, 0x34, 0x01, -0x00, 0xCA, 0x14, 0x22, 0x01, -0x00, 0xAA, 0x10, 0x22, 0x01, -0x00, 0xA2, 0x11, 0x22, 0x01, -0x00, 0x9A, 0x12, 0x22, 0x01, +0x01, 0xE0, 0x00, 0xE4, 0x01, +0x00, 0xD2, 0x0F, 0x20, 0x01, +0x00, 0xCA, 0x10, 0x22, 0x01, +0x00, 0xBA, 0x0F, 0x34, 0x01, +0x00, 0xB2, 0x10, 0x22, 0x01, +0x00, 0xAA, 0x0C, 0x22, 0x01, +0x00, 0xA2, 0x0D, 0x22, 0x01, +0x00, 0x9A, 0x0E, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0xD8, 0x00, 0xE2, 0x01, -0x00, 0xF0, 0x00, 0xF2, 0x01, -0x01, 0x1A, 0x18, 0x20, 0x01, -0x01, 0x12, 0x19, 0x22, 0x01, -0x01, 0x02, 0x18, 0x34, 0x01, -0x00, 0xFA, 0x19, 0x22, 0x01, -0x00, 0xDA, 0x15, 0x22, 0x01, -0x00, 0xD2, 0x16, 0x22, 0x01, -0x00, 0xCA, 0x17, 0x22, 0x01, +0x00, 0xC0, 0x00, 0xE2, 0x01, +0x00, 0xD8, 0x00, 0xF2, 0x01, +0x01, 0x02, 0x14, 0x20, 0x01, +0x00, 0xFA, 0x15, 0x22, 0x01, +0x00, 0xEA, 0x14, 0x34, 0x01, +0x00, 0xE2, 0x15, 0x22, 0x01, +0x00, 0xC2, 0x11, 0x22, 0x01, +0x00, 0xBA, 0x12, 0x22, 0x01, +0x00, 0xB2, 0x13, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x08, 0x00, 0xE2, 0x01, -0x01, 0x20, 0x00, 0xF2, 0x01, -0x01, 0x4A, 0x1D, 0x20, 0x01, -0x01, 0x42, 0x1E, 0x22, 0x01, -0x01, 0x32, 0x1D, 0x34, 0x01, -0x01, 0x2A, 0x1E, 0x22, 0x01, -0x01, 0x0A, 0x1A, 0x22, 0x01, -0x01, 0x02, 0x1B, 0x22, 0x01, -0x00, 0xFA, 0x1C, 0x22, 0x01, +0x00, 0xF0, 0x00, 0xE2, 0x01, +0x01, 0x08, 0x00, 0xF2, 0x01, +0x01, 0x32, 0x19, 0x20, 0x01, +0x01, 0x2A, 0x1A, 0x22, 0x01, +0x01, 0x1A, 0x19, 0x34, 0x01, +0x01, 0x12, 0x1A, 0x22, 0x01, +0x00, 0xF2, 0x16, 0x22, 0x01, +0x00, 0xEA, 0x17, 0x22, 0x01, +0x00, 0xE2, 0x18, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x38, 0x00, 0xE2, 0x01, -0x01, 0x50, 0x00, 0xF2, 0x01, -0x01, 0x7A, 0x22, 0x20, 0x01, -0x01, 0x72, 0x23, 0x22, 0x01, -0x01, 0x62, 0x22, 0x34, 0x01, -0x01, 0x5A, 0x23, 0x22, 0x01, -0x01, 0x3A, 0x1F, 0x22, 0x01, -0x01, 0x32, 0x20, 0x22, 0x01, -0x01, 0x2A, 0x21, 0x22, 0x01, +0x01, 0x20, 0x00, 0xE2, 0x01, +0x01, 0x38, 0x00, 0xF2, 0x01, +0x01, 0x62, 0x1E, 0x20, 0x01, +0x01, 0x5A, 0x1F, 0x22, 0x01, +0x01, 0x4A, 0x1E, 0x34, 0x01, +0x01, 0x42, 0x1F, 0x22, 0x01, +0x01, 0x22, 0x1B, 0x22, 0x01, +0x01, 0x1A, 0x1C, 0x22, 0x01, +0x01, 0x12, 0x1D, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x68, 0x00, 0xE2, 0x01, -0x01, 0x80, 0x00, 0xF2, 0x01, -0x01, 0xC2, 0x09, 0x20, 0x01, -0x01, 0xBA, 0x0A, 0x22, 0x01, -0x01, 0xAA, 0x09, 0x34, 0x01, -0x01, 0xA2, 0x0A, 0x22, 0x01, -0x01, 0x9A, 0x06, 0x22, 0x01, -0x01, 0x92, 0x07, 0x22, 0x01, -0x01, 0x8A, 0x08, 0x22, 0x01, +0x01, 0x50, 0x00, 0xE2, 0x01, +0x01, 0x68, 0x00, 0xF2, 0x01, +0x01, 0x92, 0x23, 0x20, 0x01, +0x01, 0x8A, 0x24, 0x22, 0x01, +0x01, 0x7A, 0x23, 0x34, 0x01, +0x01, 0x72, 0x24, 0x22, 0x01, +0x01, 0x52, 0x20, 0x22, 0x01, +0x01, 0x4A, 0x21, 0x22, 0x01, +0x01, 0x42, 0x22, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x80, 0x00, 0xE2, 0x01, +0x01, 0x98, 0x00, 0xF2, 0x01, +0x01, 0xC2, 0x28, 0x20, 0x01, +0x01, 0xBA, 0x29, 0x22, 0x01, +0x01, 0xAA, 0x28, 0x34, 0x01, +0x01, 0xA2, 0x29, 0x22, 0x01, +0x01, 0x82, 0x25, 0x22, 0x01, +0x01, 0x7A, 0x26, 0x22, 0x01, +0x01, 0x72, 0x27, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xB0, 0x00, 0xE2, 0x01, 0x01, 0xC8, 0x00, 0xF2, 0x01, -0x01, 0xF2, 0x0E, 0x20, 0x01, -0x01, 0xEA, 0x0F, 0x22, 0x01, -0x01, 0xDA, 0x0E, 0x34, 0x01, -0x01, 0xD2, 0x0F, 0x22, 0x01, -0x01, 0xB2, 0x0B, 0x22, 0x01, -0x01, 0xAA, 0x0C, 0x22, 0x01, -0x01, 0xA2, 0x0D, 0x22, 0x01, +0x02, 0x0A, 0x0F, 0x20, 0x01, +0x02, 0x02, 0x10, 0x22, 0x01, +0x01, 0xF2, 0x0F, 0x34, 0x01, +0x01, 0xEA, 0x10, 0x22, 0x01, +0x01, 0xE2, 0x0C, 0x22, 0x01, +0x01, 0xDA, 0x0D, 0x22, 0x01, +0x01, 0xD2, 0x0E, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0xE0, 0x00, 0xE2, 0x01, -0x01, 0xF8, 0x00, 0xF2, 0x01, -0x02, 0x22, 0x13, 0x20, 0x01, -0x02, 0x1A, 0x14, 0x22, 0x01, -0x02, 0x0A, 0x13, 0x34, 0x01, -0x02, 0x02, 0x14, 0x22, 0x01, -0x01, 0xE2, 0x10, 0x22, 0x01, -0x01, 0xDA, 0x11, 0x22, 0x01, -0x01, 0xD2, 0x12, 0x22, 0x01, +0x01, 0xF8, 0x00, 0xE2, 0x01, +0x02, 0x10, 0x00, 0xF2, 0x01, +0x02, 0x3A, 0x14, 0x20, 0x01, +0x02, 0x32, 0x15, 0x22, 0x01, +0x02, 0x22, 0x14, 0x34, 0x01, +0x02, 0x1A, 0x15, 0x22, 0x01, +0x01, 0xFA, 0x11, 0x22, 0x01, +0x01, 0xF2, 0x12, 0x22, 0x01, +0x01, 0xEA, 0x13, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0x10, 0x00, 0xE2, 0x01, -0x02, 0x28, 0x00, 0xF2, 0x01, -0x02, 0x52, 0x18, 0x20, 0x01, -0x02, 0x4A, 0x19, 0x22, 0x01, -0x02, 0x3A, 0x18, 0x34, 0x01, -0x02, 0x32, 0x19, 0x22, 0x01, -0x02, 0x12, 0x15, 0x22, 0x01, -0x02, 0x0A, 0x16, 0x22, 0x01, -0x02, 0x02, 0x17, 0x22, 0x01, +0x02, 0x28, 0x00, 0xE2, 0x01, +0x02, 0x40, 0x00, 0xF2, 0x01, +0x02, 0x6A, 0x19, 0x20, 0x01, +0x02, 0x62, 0x1A, 0x22, 0x01, +0x02, 0x52, 0x19, 0x34, 0x01, +0x02, 0x4A, 0x1A, 0x22, 0x01, +0x02, 0x2A, 0x16, 0x22, 0x01, +0x02, 0x22, 0x17, 0x22, 0x01, +0x02, 0x1A, 0x18, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0x40, 0x00, 0xE2, 0x01, -0x02, 0x58, 0x00, 0xF2, 0x01, -0x02, 0x82, 0x1D, 0x20, 0x01, -0x02, 0x7A, 0x1E, 0x22, 0x01, -0x02, 0x6A, 0x1D, 0x34, 0x01, -0x02, 0x62, 0x1E, 0x22, 0x01, -0x02, 0x42, 0x1A, 0x22, 0x01, -0x02, 0x3A, 0x1B, 0x22, 0x01, -0x02, 0x32, 0x1C, 0x22, 0x01, +0x02, 0x58, 0x00, 0xE2, 0x01, +0x02, 0x70, 0x00, 0xF2, 0x01, +0x02, 0x9A, 0x1E, 0x20, 0x01, +0x02, 0x92, 0x1F, 0x22, 0x01, +0x02, 0x82, 0x1E, 0x34, 0x01, +0x02, 0x7A, 0x1F, 0x22, 0x01, +0x02, 0x5A, 0x1B, 0x22, 0x01, +0x02, 0x52, 0x1C, 0x22, 0x01, +0x02, 0x4A, 0x1D, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0x70, 0x00, 0xE2, 0x01, -0x02, 0x88, 0x00, 0xF2, 0x01, -0x02, 0xB2, 0x22, 0x20, 0x01, -0x02, 0xAA, 0x23, 0x22, 0x01, -0x02, 0x9A, 0x22, 0x34, 0x01, -0x02, 0x92, 0x23, 0x22, 0x01, -0x02, 0x72, 0x1F, 0x22, 0x01, -0x02, 0x6A, 0x20, 0x22, 0x01, -0x02, 0x62, 0x21, 0x22, 0x01, +0x02, 0x88, 0x00, 0xE2, 0x01, +0x02, 0xA0, 0x00, 0xF2, 0x01, +0x02, 0xCA, 0x23, 0x20, 0x01, +0x02, 0xC2, 0x24, 0x22, 0x01, +0x02, 0xB2, 0x23, 0x34, 0x01, +0x02, 0xAA, 0x24, 0x22, 0x01, +0x02, 0x8A, 0x20, 0x22, 0x01, +0x02, 0x82, 0x21, 0x22, 0x01, +0x02, 0x7A, 0x22, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xA0, 0x00, 0xE2, 0x01, -0x02, 0xB8, 0x00, 0xF2, 0x01, -0x01, 0x6A, 0x24, 0x20, 0x01, -0x02, 0xC0, 0x00, 0xE2, 0x01, +0x02, 0xB8, 0x00, 0xE2, 0x01, +0x02, 0xD0, 0x00, 0xF2, 0x01, +0x02, 0xFA, 0x28, 0x20, 0x01, +0x02, 0xF2, 0x29, 0x22, 0x01, +0x02, 0xE2, 0x28, 0x34, 0x01, +0x02, 0xDA, 0x29, 0x22, 0x01, +0x02, 0xBA, 0x25, 0x22, 0x01, +0x02, 0xB2, 0x26, 0x22, 0x01, +0x02, 0xAA, 0x27, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xA2, 0x25, 0x20, 0x01, -0x02, 0xC8, 0x00, 0xE2, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xC1, 0x08, 0x20, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x28, 0x00, 0xF0, 0x01, -0xFF, 0xE9, 0x08, 0x22, 0x01, -0x03, 0x20, 0x00, 0xF2, 0x01, -0x03, 0x11, 0x08, 0x20, 0x01, -0x03, 0x12, 0x32, 0x22, 0x41, -0x03, 0x22, 0x32, 0x22, 0x01, -0x03, 0x01, 0x08, 0x34, 0x01, -0x03, 0x02, 0x32, 0x22, 0x41, -0x03, 0x2A, 0x32, 0x22, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x08, 0x00, 0xE2, 0x01, -0x03, 0x18, 0x00, 0xF2, 0x01, -0x03, 0x30, 0x00, 0xE2, 0x01, -0xFF, 0xF2, 0x2E, 0x40, 0x01, -0x03, 0x31, 0x08, 0x20, 0x09, -0x03, 0x32, 0x26, 0x20, 0x01, -0xFF, 0xF2, 0x27, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x03, 0x32, 0x28, 0x20, 0x01, -0xFF, 0xF2, 0x29, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x23, -0xFF, 0xF2, 0x2F, 0x40, 0x01, -0x03, 0x31, 0x08, 0x20, 0x09, -0x03, 0x32, 0x2A, 0x20, 0x01, -0xFF, 0xF2, 0x2B, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x23, -0xFF, 0xF2, 0x30, 0x40, 0x01, -0x03, 0x31, 0x08, 0x20, 0x09, -0x03, 0x32, 0x2C, 0x20, 0x01, -0xFF, 0xF2, 0x2D, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x23, -0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x03, 0x37, 0xFF, 0x20, 0x41, -0xFF, 0xF1, 0x07, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD7, 0xFF, 0x20, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x03, 0x37, 0xFF, 0x20, 0x41, -0xFF, 0xF1, 0x07, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD7, 0xFF, 0x20, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x03, 0x37, 0xFF, 0x20, 0x41, -0xFF, 0xF1, 0x07, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD7, 0xFF, 0x20, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x00, 0x02, 0x31, 0xA0, 0x01, -0xFF, 0xE7, 0xFF, 0x20, 0x01, -0x02, 0xF8, 0x00, 0xE2, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xF9, 0x08, 0x40, 0x01, -0xFF, 0xF1, 0x08, 0x20, 0x09, -0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xF8, 0x00, 0xE2, 0x23, -0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xF9, 0x08, 0x40, 0x01, -0x02, 0xF1, 0x08, 0x20, 0x09, -0x02, 0xFA, 0x33, 0x20, 0x01, -0x02, 0xF2, 0x33, 0x22, 0x41, -0x02, 0xF1, 0x08, 0x22, 0x01, -0x02, 0xF8, 0x00, 0xE2, 0x23, -0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xF9, 0x08, 0x20, 0x01, 0x02, 0xE8, 0x00, 0xE2, 0x01, -0xFF, 0xF2, 0x34, 0x22, 0x49, -0xFF, 0xF1, 0x08, 0x20, 0x01, -0xFF, 0xE9, 0x08, 0x20, 0x25, -0x02, 0xE0, 0x00, 0xE2, 0x01, -0x02, 0xF8, 0x00, 0xC0, 0x01, -0x02, 0xC7, 0xFF, 0x20, 0x01, -0x02, 0xD8, 0x00, 0xE2, 0x01, -0x02, 0xC9, 0x08, 0x20, 0x01, +0x03, 0x00, 0x00, 0xF2, 0x01, +0x01, 0xB2, 0x2A, 0x20, 0x01, +0x03, 0x08, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x28, 0x00, 0xF0, 0x01, +0x02, 0xEA, 0x2B, 0x20, 0x01, +0x03, 0x10, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x09, 0x08, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x70, 0x00, 0xF0, 0x01, 0xFF, 0xE9, 0x08, 0x22, 0x01, -0x03, 0x20, 0x00, 0xF2, 0x01, -0x03, 0x71, 0x08, 0x20, 0x01, -0x03, 0x72, 0x41, 0x22, 0x41, -0x03, 0x22, 0x41, 0x22, 0x01, -0x03, 0x61, 0x08, 0x34, 0x01, -0x03, 0x62, 0x41, 0x22, 0x41, -0x03, 0x2A, 0x41, 0x22, 0x01, +0x03, 0x68, 0x00, 0xF2, 0x01, +0x03, 0x59, 0x08, 0x20, 0x01, +0x03, 0x5A, 0x38, 0x22, 0x41, +0x03, 0x6A, 0x38, 0x22, 0x01, +0x03, 0x49, 0x08, 0x34, 0x01, +0x03, 0x4A, 0x38, 0x22, 0x41, +0x03, 0x72, 0x38, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x68, 0x00, 0xE2, 0x01, -0x03, 0x78, 0x00, 0xF2, 0x01, -0x03, 0x30, 0x00, 0xE2, 0x01, -0xFF, 0xF2, 0x3D, 0x40, 0x01, -0x03, 0x31, 0x08, 0x20, 0x09, -0x03, 0x32, 0x35, 0x20, 0x01, -0xFF, 0xF2, 0x36, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x03, 0x32, 0x37, 0x20, 0x01, -0xFF, 0xF2, 0x38, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x23, -0xFF, 0xF2, 0x3E, 0x40, 0x01, -0x03, 0x31, 0x08, 0x20, 0x09, -0x03, 0x32, 0x39, 0x20, 0x01, -0xFF, 0xF2, 0x3A, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x23, -0xFF, 0xF2, 0x3F, 0x40, 0x01, -0x03, 0x31, 0x08, 0x20, 0x09, -0x03, 0x32, 0x3B, 0x20, 0x01, -0xFF, 0xF2, 0x3C, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x23, +0x03, 0x50, 0x00, 0xE2, 0x01, +0x03, 0x60, 0x00, 0xF2, 0x01, +0x03, 0x78, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x34, 0x40, 0x01, +0x03, 0x79, 0x08, 0x20, 0x09, +0x03, 0x7A, 0x2C, 0x20, 0x01, +0xFF, 0xF2, 0x2D, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x7A, 0x2E, 0x20, 0x01, +0xFF, 0xF2, 0x2F, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x35, 0x40, 0x01, +0x03, 0x79, 0x08, 0x20, 0x09, +0x03, 0x7A, 0x30, 0x20, 0x01, +0xFF, 0xF2, 0x31, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x36, 0x40, 0x01, +0x03, 0x79, 0x08, 0x20, 0x09, +0x03, 0x7A, 0x32, 0x20, 0x01, +0xFF, 0xF2, 0x33, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x03, 0x37, 0xFF, 0x20, 0x41, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x03, 0x7F, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD7, 0xFF, 0x20, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x03, 0x37, 0xFF, 0x20, 0x41, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x1F, 0xFF, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x03, 0x7F, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD7, 0xFF, 0x20, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x03, 0x37, 0xFF, 0x20, 0x41, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x1F, 0xFF, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x03, 0x7F, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD7, 0xFF, 0x20, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x00, 0x02, 0x40, 0xA0, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x1F, 0xFF, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x00, 0x02, 0x37, 0xA0, 0x01, 0xFF, 0xE7, 0xFF, 0x20, 0x01, -0x03, 0x58, 0x00, 0xE2, 0x01, +0x03, 0x40, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x59, 0x08, 0x40, 0x01, +0x03, 0x41, 0x08, 0x40, 0x01, 0xFF, 0xF1, 0x08, 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x58, 0x00, 0xE2, 0x23, +0x03, 0x40, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x59, 0x08, 0x40, 0x01, -0x03, 0x51, 0x08, 0x20, 0x09, -0x03, 0x5A, 0x42, 0x20, 0x01, -0x03, 0x52, 0x42, 0x22, 0x41, -0x03, 0x51, 0x08, 0x22, 0x01, -0x03, 0x58, 0x00, 0xE2, 0x23, +0x03, 0x41, 0x08, 0x40, 0x01, +0x03, 0x39, 0x08, 0x20, 0x09, +0x03, 0x42, 0x39, 0x20, 0x01, +0x03, 0x3A, 0x39, 0x22, 0x41, +0x03, 0x39, 0x08, 0x22, 0x01, +0x03, 0x40, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x59, 0x08, 0x20, 0x01, -0x03, 0x48, 0x00, 0xE2, 0x01, -0xFF, 0xF2, 0x43, 0x22, 0x49, +0x03, 0x41, 0x08, 0x20, 0x01, +0x03, 0x30, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x3A, 0x22, 0x49, 0xFF, 0xF1, 0x08, 0x20, 0x01, 0xFF, 0xE9, 0x08, 0x20, 0x25, -0x03, 0x40, 0x00, 0xE2, 0x01, -0x03, 0x58, 0x00, 0xC0, 0x01, -0x02, 0xCF, 0xFF, 0x20, 0x01, -0x03, 0x38, 0x00, 0xE2, 0x01, -0x03, 0x39, 0x08, 0x20, 0x01, +0x03, 0x28, 0x00, 0xE2, 0x01, +0x03, 0x40, 0x00, 0xC0, 0x01, +0x03, 0x0F, 0xFF, 0x20, 0x01, +0x03, 0x20, 0x00, 0xE2, 0x01, +0x03, 0x11, 0x08, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x70, 0x00, 0xF0, 0x01, +0xFF, 0xE9, 0x08, 0x22, 0x01, +0x03, 0x68, 0x00, 0xF2, 0x01, +0x03, 0xB9, 0x08, 0x20, 0x01, +0x03, 0xBA, 0x47, 0x22, 0x41, +0x03, 0x6A, 0x47, 0x22, 0x01, +0x03, 0xA9, 0x08, 0x34, 0x01, +0x03, 0xAA, 0x47, 0x22, 0x41, +0x03, 0x72, 0x47, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0xB0, 0x00, 0xE2, 0x01, +0x03, 0xC0, 0x00, 0xF2, 0x01, +0x03, 0x78, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x43, 0x40, 0x01, +0x03, 0x79, 0x08, 0x20, 0x09, +0x03, 0x7A, 0x3B, 0x20, 0x01, +0xFF, 0xF2, 0x3C, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x7A, 0x3D, 0x20, 0x01, +0xFF, 0xF2, 0x3E, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x44, 0x40, 0x01, +0x03, 0x79, 0x08, 0x20, 0x09, +0x03, 0x7A, 0x3F, 0x20, 0x01, +0xFF, 0xF2, 0x40, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x45, 0x40, 0x01, +0x03, 0x79, 0x08, 0x20, 0x09, +0x03, 0x7A, 0x41, 0x20, 0x01, +0xFF, 0xF2, 0x42, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x03, 0x7F, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x1F, 0xFF, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x03, 0x7F, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x1F, 0xFF, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x03, 0x7F, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x1F, 0xFF, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x00, 0x02, 0x46, 0xA0, 0x01, +0xFF, 0xE7, 0xFF, 0x20, 0x01, +0x03, 0xA0, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0xA1, 0x08, 0x40, 0x01, +0xFF, 0xF1, 0x08, 0x20, 0x09, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0xA0, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0xA1, 0x08, 0x40, 0x01, +0x03, 0x99, 0x08, 0x20, 0x09, +0x03, 0xA2, 0x48, 0x20, 0x01, +0x03, 0x9A, 0x48, 0x22, 0x41, +0x03, 0x99, 0x08, 0x22, 0x01, +0x03, 0xA0, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0xA1, 0x08, 0x20, 0x01, +0x03, 0x90, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x49, 0x22, 0x49, +0xFF, 0xF1, 0x08, 0x20, 0x01, +0xFF, 0xE9, 0x08, 0x20, 0x25, +0x03, 0x88, 0x00, 0xE2, 0x01, +0x03, 0xA0, 0x00, 0xC0, 0x01, +0x03, 0x17, 0xFF, 0x20, 0x01, +0x03, 0x80, 0x00, 0xE2, 0x01, +0x03, 0x81, 0x08, 0x20, 0x01, 0xFF, 0x30, 0x00, 0x02, 0x01, -0x02, 0xD9, 0x08, 0x20, 0x01, +0x03, 0x21, 0x08, 0x20, 0x01, 0xFF, 0x28, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, @@ -1031,34 +1053,18 @@ ADI_REG_TYPE Program_Data_IC_1[PROGRAM_SIZE_IC_1] = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, }; /* DSP Parameter (Coefficient) Data */ #define PARAM_SIZE_IC_1 4096 #define PARAM_ADDR_IC_1 0 ADI_REG_TYPE Param_Data_IC_1[PARAM_SIZE_IC_1] = { +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x6C, 0xAC, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, @@ -2077,12 +2083,6 @@ ADI_REG_TYPE Param_Data_IC_1[PARAM_SIZE_IC_1] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, }; @@ -2094,7 +2094,7 @@ ADI_REG_TYPE R0_COREREGISTER_IC_1_Default[REG_COREREGISTER_IC_1_BYTE] = { /* Register Default - IC 1.HWConFiguration */ #define R3_HWCONFIGURATION_IC_1_SIZE 24 ADI_REG_TYPE R3_HWCONFIGURATION_IC_1_Default[R3_HWCONFIGURATION_IC_1_SIZE] = { -0x00, 0x18, 0x08, 0x08, 0x00, 0x00, 0x44, 0x00, 0x44, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 +0x00, 0x18, 0x0B, 0x08, 0x00, 0x00, 0x44, 0x00, 0x44, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }; /* Register Default - IC 1.CoreRegister */ diff --git a/Software/Firmware/ADAU1701-Firmware/DigiRadio_IC_1_PARAM.h b/Software/Firmware/ADAU1701-Firmware/DigiRadio_IC_1_PARAM.h index 84cad57..f818e2b 100644 --- a/Software/Firmware/ADAU1701-Firmware/DigiRadio_IC_1_PARAM.h +++ b/Software/Firmware/ADAU1701-Firmware/DigiRadio_IC_1_PARAM.h @@ -1,7 +1,7 @@ /* - * File: C:\Users\mikbi\Documents\Allegati\Desktop\DigiRadio\DigiRadio_IC_1_PARAM.h + * File: C:\Users\mikbi\Documents\Allegati\Desktop\DigiRadio\DigiRadioModificato\DigiRadio_IC_1_PARAM.h * - * Created: Monday, July 6, 2026 2:41:28 PM + * Created: Friday, August 7, 2026 3:19:11 AM * Description: DigiRadio:IC 1 parameter RAM definitions. * * This software is distributed in the hope that it will be useful, @@ -20,14 +20,30 @@ #define __DIGIRADIO_IC_1_PARAM_H__ +/* Module Beep1 - Beep Sources*/ +#define COUNT_BEEP1 3 +#define DEVICE_BEEP1 "IC1" +#define ADDR_BEEP1_ENABLE 0 +#define FIXPT_BEEP1_ENABLE 0x00000000 +#define VALUE_BEEP1_ENABLE SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_BEEP1_ENABLE SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_BEEP1_KICK 1 +#define FIXPT_BEEP1_KICK 0x00000000 +#define VALUE_BEEP1_KICK SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_BEEP1_KICK SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_BEEP1_BEEP_FREQ 2 +#define FIXPT_BEEP1_BEEP_FREQ 0x00006CAB +#define VALUE_BEEP1_BEEP_FREQ SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.00331636677280911) +#define TYPE_BEEP1_BEEP_FREQ SIGMASTUDIOTYPE_FIXPOINT + /* Module Si4674 - Multiple Volume Control*/ #define COUNT_SI4674 2 #define DEVICE_SI4674 "IC1" -#define ADDR_SI4674 0 +#define ADDR_SI4674 3 #define FIXPT_SI4674 0x00800000 #define VALUE_SI4674 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_SI4674 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_SI4674_1 1 +#define ADDR_SI4674_1 4 #define FIXPT_SI4674_1 0x00800000 #define VALUE_SI4674_1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_SI4674_1 SIGMASTUDIOTYPE_FIXPOINT @@ -35,267 +51,287 @@ /* Module ESP32 - Multiple Volume Control*/ #define COUNT_ESP32 2 #define DEVICE_ESP32 "IC1" -#define ADDR_ESP32 2 +#define ADDR_ESP32 5 #define FIXPT_ESP32 0x00800000 #define VALUE_ESP32 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_ESP32 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_ESP32_1 3 +#define ADDR_ESP32_1 6 #define FIXPT_ESP32_1 0x00800000 #define VALUE_ESP32_1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_ESP32_1 SIGMASTUDIOTYPE_FIXPOINT +/* Module Single 1 - Single Volume*/ +#define COUNT_SINGLE1 1 +#define DEVICE_SINGLE1 "IC1" +#define ADDR_SINGLE1 7 +#define FIXPT_SINGLE1 0x00800000 +#define VALUE_SINGLE1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_SINGLE1 SIGMASTUDIOTYPE_FIXPOINT + +/* Module S Splitter1 - Single Control Splitter*/ +#define COUNT_SSPLITTER1 1 +#define DEVICE_SSPLITTER1 "IC1" +#define ADDR_SSPLITTER1 8 +#define FIXPT_SSPLITTER1 0x00800000 +#define VALUE_SSPLITTER1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_SSPLITTER1 SIGMASTUDIOTYPE_FIXPOINT + /* Module St Mixer1 - Stereo Mixer*/ -#define COUNT_STMIXER1 2 +#define COUNT_STMIXER1 3 #define DEVICE_STMIXER1 "IC1" -#define ADDR_STMIXER1_ST0_VOLUME 4 +#define ADDR_STMIXER1_ST0_VOLUME 9 #define FIXPT_STMIXER1_ST0_VOLUME 0x00800000 #define VALUE_STMIXER1_ST0_VOLUME SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_STMIXER1_ST0_VOLUME SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_STMIXER1_ST1_VOLUME 5 +#define ADDR_STMIXER1_ST1_VOLUME 10 #define FIXPT_STMIXER1_ST1_VOLUME 0x00800000 #define VALUE_STMIXER1_ST1_VOLUME SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_STMIXER1_ST1_VOLUME SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_STMIXER1_ST2_VOLUME 11 +#define FIXPT_STMIXER1_ST2_VOLUME 0x00800000 +#define VALUE_STMIXER1_ST2_VOLUME SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_STMIXER1_ST2_VOLUME SIGMASTUDIOTYPE_FIXPOINT /* Module Param EQ1 - Parametric EQ*/ #define COUNT_PARAMEQ1 60 #define DEVICE_PARAMEQ1 "IC1" -#define ADDR_PARAMEQ1_ST0_B0 6 +#define ADDR_PARAMEQ1_ST0_B0 12 #define FIXPT_PARAMEQ1_ST0_B0 0x007FC365 #define VALUE_PARAMEQ1_ST0_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.998150511190452) #define TYPE_PARAMEQ1_ST0_B0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST0_B0 6 +#define ADDR_PARAMEQ1_ST0_B0 12 #define FIXPT_PARAMEQ1_ST0_B0 0x007FC365 #define VALUE_PARAMEQ1_ST0_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.998150511190452) #define TYPE_PARAMEQ1_ST0_B0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST0_B1 7 +#define ADDR_PARAMEQ1_ST0_B1 13 #define FIXPT_PARAMEQ1_ST0_B1 0xFF007936 #define VALUE_PARAMEQ1_ST0_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-1.9963010223809) #define TYPE_PARAMEQ1_ST0_B1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST0_B1 7 +#define ADDR_PARAMEQ1_ST0_B1 13 #define FIXPT_PARAMEQ1_ST0_B1 0xFF007936 #define VALUE_PARAMEQ1_ST0_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-1.9963010223809) #define TYPE_PARAMEQ1_ST0_B1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST0_B2 8 +#define ADDR_PARAMEQ1_ST0_B2 14 #define FIXPT_PARAMEQ1_ST0_B2 0x007FC365 #define VALUE_PARAMEQ1_ST0_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.998150511190452) #define TYPE_PARAMEQ1_ST0_B2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST0_B2 8 +#define ADDR_PARAMEQ1_ST0_B2 14 #define FIXPT_PARAMEQ1_ST0_B2 0x007FC365 #define VALUE_PARAMEQ1_ST0_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.998150511190452) #define TYPE_PARAMEQ1_ST0_B2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST0_A0 9 +#define ADDR_PARAMEQ1_ST0_A0 15 #define FIXPT_PARAMEQ1_ST0_A0 0x00FF86AE #define VALUE_PARAMEQ1_ST0_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1.99629760176912) #define TYPE_PARAMEQ1_ST0_A0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST0_A0 9 +#define ADDR_PARAMEQ1_ST0_A0 15 #define FIXPT_PARAMEQ1_ST0_A0 0x00FF86AE #define VALUE_PARAMEQ1_ST0_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1.99629760176912) #define TYPE_PARAMEQ1_ST0_A0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST0_A1 10 +#define ADDR_PARAMEQ1_ST0_A1 16 #define FIXPT_PARAMEQ1_ST0_A1 0xFF807919 #define VALUE_PARAMEQ1_ST0_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.996304442992686) #define TYPE_PARAMEQ1_ST0_A1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST0_A1 10 +#define ADDR_PARAMEQ1_ST0_A1 16 #define FIXPT_PARAMEQ1_ST0_A1 0xFF807919 #define VALUE_PARAMEQ1_ST0_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.996304442992686) #define TYPE_PARAMEQ1_ST0_A1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST1_B0 11 +#define ADDR_PARAMEQ1_ST1_B0 17 #define FIXPT_PARAMEQ1_ST1_B0 0x00800000 #define VALUE_PARAMEQ1_ST1_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_PARAMEQ1_ST1_B0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST1_B0 11 +#define ADDR_PARAMEQ1_ST1_B0 17 #define FIXPT_PARAMEQ1_ST1_B0 0x00800000 #define VALUE_PARAMEQ1_ST1_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_PARAMEQ1_ST1_B0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST1_B1 12 +#define ADDR_PARAMEQ1_ST1_B1 18 #define FIXPT_PARAMEQ1_ST1_B1 0x00000000 #define VALUE_PARAMEQ1_ST1_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST1_B1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST1_B1 12 +#define ADDR_PARAMEQ1_ST1_B1 18 #define FIXPT_PARAMEQ1_ST1_B1 0x00000000 #define VALUE_PARAMEQ1_ST1_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST1_B1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST1_B2 13 +#define ADDR_PARAMEQ1_ST1_B2 19 #define FIXPT_PARAMEQ1_ST1_B2 0x00000000 #define VALUE_PARAMEQ1_ST1_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST1_B2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST1_B2 13 +#define ADDR_PARAMEQ1_ST1_B2 19 #define FIXPT_PARAMEQ1_ST1_B2 0x00000000 #define VALUE_PARAMEQ1_ST1_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST1_B2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST1_A0 14 +#define ADDR_PARAMEQ1_ST1_A0 20 #define FIXPT_PARAMEQ1_ST1_A0 0x00000000 #define VALUE_PARAMEQ1_ST1_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST1_A0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST1_A0 14 +#define ADDR_PARAMEQ1_ST1_A0 20 #define FIXPT_PARAMEQ1_ST1_A0 0x00000000 #define VALUE_PARAMEQ1_ST1_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST1_A0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST1_A1 15 +#define ADDR_PARAMEQ1_ST1_A1 21 #define FIXPT_PARAMEQ1_ST1_A1 0x00000000 #define VALUE_PARAMEQ1_ST1_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST1_A1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST1_A1 15 +#define ADDR_PARAMEQ1_ST1_A1 21 #define FIXPT_PARAMEQ1_ST1_A1 0x00000000 #define VALUE_PARAMEQ1_ST1_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST1_A1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST2_B0 16 +#define ADDR_PARAMEQ1_ST2_B0 22 #define FIXPT_PARAMEQ1_ST2_B0 0x00800000 #define VALUE_PARAMEQ1_ST2_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_PARAMEQ1_ST2_B0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST2_B0 16 +#define ADDR_PARAMEQ1_ST2_B0 22 #define FIXPT_PARAMEQ1_ST2_B0 0x00800000 #define VALUE_PARAMEQ1_ST2_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_PARAMEQ1_ST2_B0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST2_B1 17 +#define ADDR_PARAMEQ1_ST2_B1 23 #define FIXPT_PARAMEQ1_ST2_B1 0x00000000 #define VALUE_PARAMEQ1_ST2_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST2_B1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST2_B1 17 +#define ADDR_PARAMEQ1_ST2_B1 23 #define FIXPT_PARAMEQ1_ST2_B1 0x00000000 #define VALUE_PARAMEQ1_ST2_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST2_B1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST2_B2 18 +#define ADDR_PARAMEQ1_ST2_B2 24 #define FIXPT_PARAMEQ1_ST2_B2 0x00000000 #define VALUE_PARAMEQ1_ST2_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST2_B2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST2_B2 18 +#define ADDR_PARAMEQ1_ST2_B2 24 #define FIXPT_PARAMEQ1_ST2_B2 0x00000000 #define VALUE_PARAMEQ1_ST2_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST2_B2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST2_A0 19 +#define ADDR_PARAMEQ1_ST2_A0 25 #define FIXPT_PARAMEQ1_ST2_A0 0x00000000 #define VALUE_PARAMEQ1_ST2_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST2_A0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST2_A0 19 +#define ADDR_PARAMEQ1_ST2_A0 25 #define FIXPT_PARAMEQ1_ST2_A0 0x00000000 #define VALUE_PARAMEQ1_ST2_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST2_A0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST2_A1 20 +#define ADDR_PARAMEQ1_ST2_A1 26 #define FIXPT_PARAMEQ1_ST2_A1 0x00000000 #define VALUE_PARAMEQ1_ST2_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST2_A1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST2_A1 20 +#define ADDR_PARAMEQ1_ST2_A1 26 #define FIXPT_PARAMEQ1_ST2_A1 0x00000000 #define VALUE_PARAMEQ1_ST2_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST2_A1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST3_B0 21 +#define ADDR_PARAMEQ1_ST3_B0 27 #define FIXPT_PARAMEQ1_ST3_B0 0x00800000 #define VALUE_PARAMEQ1_ST3_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_PARAMEQ1_ST3_B0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST3_B0 21 +#define ADDR_PARAMEQ1_ST3_B0 27 #define FIXPT_PARAMEQ1_ST3_B0 0x00800000 #define VALUE_PARAMEQ1_ST3_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_PARAMEQ1_ST3_B0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST3_B1 22 +#define ADDR_PARAMEQ1_ST3_B1 28 #define FIXPT_PARAMEQ1_ST3_B1 0x00000000 #define VALUE_PARAMEQ1_ST3_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST3_B1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST3_B1 22 +#define ADDR_PARAMEQ1_ST3_B1 28 #define FIXPT_PARAMEQ1_ST3_B1 0x00000000 #define VALUE_PARAMEQ1_ST3_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST3_B1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST3_B2 23 +#define ADDR_PARAMEQ1_ST3_B2 29 #define FIXPT_PARAMEQ1_ST3_B2 0x00000000 #define VALUE_PARAMEQ1_ST3_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST3_B2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST3_B2 23 +#define ADDR_PARAMEQ1_ST3_B2 29 #define FIXPT_PARAMEQ1_ST3_B2 0x00000000 #define VALUE_PARAMEQ1_ST3_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST3_B2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST3_A0 24 +#define ADDR_PARAMEQ1_ST3_A0 30 #define FIXPT_PARAMEQ1_ST3_A0 0x00000000 #define VALUE_PARAMEQ1_ST3_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST3_A0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST3_A0 24 +#define ADDR_PARAMEQ1_ST3_A0 30 #define FIXPT_PARAMEQ1_ST3_A0 0x00000000 #define VALUE_PARAMEQ1_ST3_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST3_A0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST3_A1 25 +#define ADDR_PARAMEQ1_ST3_A1 31 #define FIXPT_PARAMEQ1_ST3_A1 0x00000000 #define VALUE_PARAMEQ1_ST3_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST3_A1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST3_A1 25 +#define ADDR_PARAMEQ1_ST3_A1 31 #define FIXPT_PARAMEQ1_ST3_A1 0x00000000 #define VALUE_PARAMEQ1_ST3_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST3_A1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST4_B0 26 +#define ADDR_PARAMEQ1_ST4_B0 32 #define FIXPT_PARAMEQ1_ST4_B0 0x00800000 #define VALUE_PARAMEQ1_ST4_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_PARAMEQ1_ST4_B0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST4_B0 26 +#define ADDR_PARAMEQ1_ST4_B0 32 #define FIXPT_PARAMEQ1_ST4_B0 0x00800000 #define VALUE_PARAMEQ1_ST4_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_PARAMEQ1_ST4_B0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST4_B1 27 +#define ADDR_PARAMEQ1_ST4_B1 33 #define FIXPT_PARAMEQ1_ST4_B1 0x00000000 #define VALUE_PARAMEQ1_ST4_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST4_B1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST4_B1 27 +#define ADDR_PARAMEQ1_ST4_B1 33 #define FIXPT_PARAMEQ1_ST4_B1 0x00000000 #define VALUE_PARAMEQ1_ST4_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST4_B1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST4_B2 28 +#define ADDR_PARAMEQ1_ST4_B2 34 #define FIXPT_PARAMEQ1_ST4_B2 0x00000000 #define VALUE_PARAMEQ1_ST4_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST4_B2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST4_B2 28 +#define ADDR_PARAMEQ1_ST4_B2 34 #define FIXPT_PARAMEQ1_ST4_B2 0x00000000 #define VALUE_PARAMEQ1_ST4_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST4_B2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST4_A0 29 +#define ADDR_PARAMEQ1_ST4_A0 35 #define FIXPT_PARAMEQ1_ST4_A0 0x00000000 #define VALUE_PARAMEQ1_ST4_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST4_A0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST4_A0 29 +#define ADDR_PARAMEQ1_ST4_A0 35 #define FIXPT_PARAMEQ1_ST4_A0 0x00000000 #define VALUE_PARAMEQ1_ST4_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST4_A0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST4_A1 30 +#define ADDR_PARAMEQ1_ST4_A1 36 #define FIXPT_PARAMEQ1_ST4_A1 0x00000000 #define VALUE_PARAMEQ1_ST4_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST4_A1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST4_A1 30 +#define ADDR_PARAMEQ1_ST4_A1 36 #define FIXPT_PARAMEQ1_ST4_A1 0x00000000 #define VALUE_PARAMEQ1_ST4_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST4_A1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST5_B0 31 +#define ADDR_PARAMEQ1_ST5_B0 37 #define FIXPT_PARAMEQ1_ST5_B0 0x00800000 #define VALUE_PARAMEQ1_ST5_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_PARAMEQ1_ST5_B0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST5_B0 31 +#define ADDR_PARAMEQ1_ST5_B0 37 #define FIXPT_PARAMEQ1_ST5_B0 0x00800000 #define VALUE_PARAMEQ1_ST5_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_PARAMEQ1_ST5_B0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST5_B1 32 +#define ADDR_PARAMEQ1_ST5_B1 38 #define FIXPT_PARAMEQ1_ST5_B1 0x00000000 #define VALUE_PARAMEQ1_ST5_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST5_B1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST5_B1 32 +#define ADDR_PARAMEQ1_ST5_B1 38 #define FIXPT_PARAMEQ1_ST5_B1 0x00000000 #define VALUE_PARAMEQ1_ST5_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST5_B1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST5_B2 33 +#define ADDR_PARAMEQ1_ST5_B2 39 #define FIXPT_PARAMEQ1_ST5_B2 0x00000000 #define VALUE_PARAMEQ1_ST5_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST5_B2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST5_B2 33 +#define ADDR_PARAMEQ1_ST5_B2 39 #define FIXPT_PARAMEQ1_ST5_B2 0x00000000 #define VALUE_PARAMEQ1_ST5_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST5_B2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST5_A0 34 +#define ADDR_PARAMEQ1_ST5_A0 40 #define FIXPT_PARAMEQ1_ST5_A0 0x00000000 #define VALUE_PARAMEQ1_ST5_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST5_A0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST5_A0 34 +#define ADDR_PARAMEQ1_ST5_A0 40 #define FIXPT_PARAMEQ1_ST5_A0 0x00000000 #define VALUE_PARAMEQ1_ST5_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST5_A0 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST5_A1 35 +#define ADDR_PARAMEQ1_ST5_A1 41 #define FIXPT_PARAMEQ1_ST5_A1 0x00000000 #define VALUE_PARAMEQ1_ST5_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST5_A1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_PARAMEQ1_ST5_A1 35 +#define ADDR_PARAMEQ1_ST5_A1 41 #define FIXPT_PARAMEQ1_ST5_A1 0x00000000 #define VALUE_PARAMEQ1_ST5_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) #define TYPE_PARAMEQ1_ST5_A1 SIGMASTUDIOTYPE_FIXPOINT @@ -303,11 +339,11 @@ /* Module Multiple 1 - Multiple Volume Control*/ #define COUNT_MULTIPLE1 2 #define DEVICE_MULTIPLE1 "IC1" -#define ADDR_MULTIPLE1 36 +#define ADDR_MULTIPLE1 42 #define FIXPT_MULTIPLE1 0x00800000 #define VALUE_MULTIPLE1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_MULTIPLE1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_MULTIPLE1_1 37 +#define ADDR_MULTIPLE1_1 43 #define FIXPT_MULTIPLE1_1 0x00800000 #define VALUE_MULTIPLE1_1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_MULTIPLE1_1 SIGMASTUDIOTYPE_FIXPOINT @@ -315,63 +351,63 @@ /* Module Limiter 1 - Limiter*/ #define COUNT_LIMITER1 15 #define DEVICE_LIMITER1 "IC1" -#define ADDR_LIMITER1_S1 38 +#define ADDR_LIMITER1_S1 44 #define FIXPT_LIMITER1_S1 0xFFFE2BE3 #define VALUE_LIMITER1_S1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.01428571428571) #define TYPE_LIMITER1_S1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_INT1 39 +#define ADDR_LIMITER1_INT1 45 #define FIXPT_LIMITER1_INT1 0x0022BE2B #define VALUE_LIMITER1_INT1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.27142857142857) #define TYPE_LIMITER1_INT1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_S2 40 +#define ADDR_LIMITER1_S2 46 #define FIXPT_LIMITER1_S2 0xFFEAAAAB #define VALUE_LIMITER1_S2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.16666666666667) #define TYPE_LIMITER1_S2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_INT2 41 +#define ADDR_LIMITER1_INT2 47 #define FIXPT_LIMITER1_INT2 0x006AAAAA #define VALUE_LIMITER1_INT2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.8333333333333) #define TYPE_LIMITER1_INT2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_S3 42 +#define ADDR_LIMITER1_S3 48 #define FIXPT_LIMITER1_S3 0xFF9A69A7 #define VALUE_LIMITER1_S3 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.79365079365079) #define TYPE_LIMITER1_S3 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_INT3 43 +#define ADDR_LIMITER1_INT3 49 #define FIXPT_LIMITER1_INT3 0x00FDF7DF #define VALUE_LIMITER1_INT3 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1.98412698412698) #define TYPE_LIMITER1_INT3 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_S4 44 +#define ADDR_LIMITER1_S4 50 #define FIXPT_LIMITER1_S4 0xF83C6C20 #define VALUE_LIMITER1_S4 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-15.527950310559) #define TYPE_LIMITER1_S4 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_INT4 45 +#define ADDR_LIMITER1_INT4 51 #define FIXPT_LIMITER1_INT4 0x03F5AA22 #define VALUE_LIMITER1_INT4 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(7.91925465838509) #define TYPE_LIMITER1_INT4 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_C1 46 +#define ADDR_LIMITER1_C1 52 #define FIXPT_LIMITER1_C1 0x01800000 #define VALUE_LIMITER1_C1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(3) #define TYPE_LIMITER1_C1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_C2 47 +#define ADDR_LIMITER1_C2 53 #define FIXPT_LIMITER1_C2 0x01000000 #define VALUE_LIMITER1_C2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(2) #define TYPE_LIMITER1_C2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_C3 48 +#define ADDR_LIMITER1_C3 54 #define FIXPT_LIMITER1_C3 0x00333333 #define VALUE_LIMITER1_C3 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.4) #define TYPE_LIMITER1_C3 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_THRESHOLD 49 +#define ADDR_LIMITER1_THRESHOLD 55 #define FIXPT_LIMITER1_THRESHOLD 0x00800000 #define VALUE_LIMITER1_THRESHOLD SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_LIMITER1_THRESHOLD SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_RMS 50 +#define ADDR_LIMITER1_RMS 56 #define FIXPT_LIMITER1_RMS 0x000007DC #define VALUE_LIMITER1_RMS SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.000239881380791562) #define TYPE_LIMITER1_RMS SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_DECAY 51 +#define ADDR_LIMITER1_DECAY 57 #define FIXPT_LIMITER1_DECAY 0x00000800 #define VALUE_LIMITER1_DECAY SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.000244140625) #define TYPE_LIMITER1_DECAY SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER1_DECAYCOMPLEMENT 52 +#define ADDR_LIMITER1_DECAYCOMPLEMENT 58 #define FIXPT_LIMITER1_DECAYCOMPLEMENT 0x007FF000 #define VALUE_LIMITER1_DECAYCOMPLEMENT SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.99951171875) #define TYPE_LIMITER1_DECAYCOMPLEMENT SIGMASTUDIOTYPE_FIXPOINT @@ -379,63 +415,63 @@ /* Module Limiter 2 - Limiter*/ #define COUNT_LIMITER2 15 #define DEVICE_LIMITER2 "IC1" -#define ADDR_LIMITER2_S1 53 +#define ADDR_LIMITER2_S1 59 #define FIXPT_LIMITER2_S1 0xFFFE2BE3 #define VALUE_LIMITER2_S1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.01428571428571) #define TYPE_LIMITER2_S1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_INT1 54 +#define ADDR_LIMITER2_INT1 60 #define FIXPT_LIMITER2_INT1 0x0022BE2B #define VALUE_LIMITER2_INT1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.27142857142857) #define TYPE_LIMITER2_INT1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_S2 55 +#define ADDR_LIMITER2_S2 61 #define FIXPT_LIMITER2_S2 0xFFEAAAAB #define VALUE_LIMITER2_S2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.16666666666667) #define TYPE_LIMITER2_S2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_INT2 56 +#define ADDR_LIMITER2_INT2 62 #define FIXPT_LIMITER2_INT2 0x006AAAAA #define VALUE_LIMITER2_INT2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.8333333333333) #define TYPE_LIMITER2_INT2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_S3 57 +#define ADDR_LIMITER2_S3 63 #define FIXPT_LIMITER2_S3 0xFF9A69A7 #define VALUE_LIMITER2_S3 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.79365079365079) #define TYPE_LIMITER2_S3 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_INT3 58 +#define ADDR_LIMITER2_INT3 64 #define FIXPT_LIMITER2_INT3 0x00FDF7DF #define VALUE_LIMITER2_INT3 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1.98412698412698) #define TYPE_LIMITER2_INT3 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_S4 59 +#define ADDR_LIMITER2_S4 65 #define FIXPT_LIMITER2_S4 0xF83C6C20 #define VALUE_LIMITER2_S4 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-15.527950310559) #define TYPE_LIMITER2_S4 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_INT4 60 +#define ADDR_LIMITER2_INT4 66 #define FIXPT_LIMITER2_INT4 0x03F5AA22 #define VALUE_LIMITER2_INT4 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(7.91925465838509) #define TYPE_LIMITER2_INT4 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_C1 61 +#define ADDR_LIMITER2_C1 67 #define FIXPT_LIMITER2_C1 0x01800000 #define VALUE_LIMITER2_C1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(3) #define TYPE_LIMITER2_C1 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_C2 62 +#define ADDR_LIMITER2_C2 68 #define FIXPT_LIMITER2_C2 0x01000000 #define VALUE_LIMITER2_C2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(2) #define TYPE_LIMITER2_C2 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_C3 63 +#define ADDR_LIMITER2_C3 69 #define FIXPT_LIMITER2_C3 0x00333333 #define VALUE_LIMITER2_C3 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.4) #define TYPE_LIMITER2_C3 SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_THRESHOLD 64 +#define ADDR_LIMITER2_THRESHOLD 70 #define FIXPT_LIMITER2_THRESHOLD 0x00800000 #define VALUE_LIMITER2_THRESHOLD SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) #define TYPE_LIMITER2_THRESHOLD SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_RMS 65 +#define ADDR_LIMITER2_RMS 71 #define FIXPT_LIMITER2_RMS 0x000007DC #define VALUE_LIMITER2_RMS SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.000239881380791562) #define TYPE_LIMITER2_RMS SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_DECAY 66 +#define ADDR_LIMITER2_DECAY 72 #define FIXPT_LIMITER2_DECAY 0x00000800 #define VALUE_LIMITER2_DECAY SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.000244140625) #define TYPE_LIMITER2_DECAY SIGMASTUDIOTYPE_FIXPOINT -#define ADDR_LIMITER2_DECAYCOMPLEMENT 67 +#define ADDR_LIMITER2_DECAYCOMPLEMENT 73 #define FIXPT_LIMITER2_DECAYCOMPLEMENT 0x007FF000 #define VALUE_LIMITER2_DECAYCOMPLEMENT SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.99951171875) #define TYPE_LIMITER2_DECAYCOMPLEMENT SIGMASTUDIOTYPE_FIXPOINT diff --git a/Software/Firmware/ADAU1701-Firmware/DigiRadio_IC_1_REG.h b/Software/Firmware/ADAU1701-Firmware/DigiRadio_IC_1_REG.h index 0d0016b..fed84c3 100644 --- a/Software/Firmware/ADAU1701-Firmware/DigiRadio_IC_1_REG.h +++ b/Software/Firmware/ADAU1701-Firmware/DigiRadio_IC_1_REG.h @@ -1,7 +1,7 @@ /* - * File: C:\Users\mikbi\Documents\Allegati\Desktop\DigiRadio\DigiRadio_IC_1_REG.h + * File: C:\Users\mikbi\Documents\Allegati\Desktop\DigiRadio\DigiRadioModificato\DigiRadio_IC_1_REG.h * - * Created: Monday, July 6, 2026 2:41:28 PM + * Created: Friday, August 7, 2026 3:19:11 AM * Description: DigiRadio:IC 1 control register definitions. * * This software is distributed in the hope that it will be useful, @@ -93,7 +93,7 @@ /* RAMRegister - Registers (IC 1) */ #define REG_RAMREGISTER_IC_1_ADDR 0x81D #define REG_RAMREGISTER_IC_1_BYTE 1 -#define REG_RAMREGISTER_IC_1_VALUE 0x8 +#define REG_RAMREGISTER_IC_1_VALUE 0xB /* SerialOutRegister1 - Registers (IC 1) */ #define REG_SERIALOUTREGISTER1_IC_1_ADDR 0x81E @@ -286,7 +286,7 @@ #define R13_EXTMEM_SPEED_IC_1_SHIFT 12 /* RAMRegister (IC 1) */ -#define R14_RAM_MODULO_IC_1 0x8 /* 1000b [3:0] */ +#define R14_RAM_MODULO_IC_1 0xB /* 1011b [3:0] */ #define R14_RAM_MODULO_IC_1_MASK 0xF #define R14_RAM_MODULO_IC_1_SHIFT 0 diff --git a/Software/Firmware/ADAU1701-Firmware/DigiRadio_NetList.xml b/Software/Firmware/ADAU1701-Firmware/DigiRadio_NetList.xml index 715ce51..c850e4e 100644 --- a/Software/Firmware/ADAU1701-Firmware/DigiRadio_NetList.xml +++ b/Software/Firmware/ADAU1701-Firmware/DigiRadio_NetList.xml @@ -23,6 +23,9 @@ + + + @@ -39,41 +42,52 @@ - + + + + + + + + + + + + - + - + - + - + - + - + - + - - + + diff --git a/Software/Firmware/ADAU1701-Firmware/SigmaStudioFW.h b/Software/Firmware/ADAU1701-Firmware/SigmaStudioFW.h index 1719e94..b961913 100644 --- a/Software/Firmware/ADAU1701-Firmware/SigmaStudioFW.h +++ b/Software/Firmware/ADAU1701-Firmware/SigmaStudioFW.h @@ -31,6 +31,21 @@ void sigma_studio_bind_i2c(int port, unsigned char addr7); /** @brief Attach the I2C device handle created by Adau1701Driver. */ void sigma_studio_set_device(void* i2cDevHandle); +/** + * @brief Acquire the process-wide ADAU1701 I2C lock. + * + * Guards a logical multi-transaction operation (e.g. a safeload burst) + * against interleaving from another FreeRTOS task — individual + * i2c_master_transmit calls are already serialised by the ESP-IDF I2C + * driver, but a sequence of several transactions is not atomic without + * this. Callers: Adau1701Driver safeload paths and the SigmaStudio TCP + * bridge (components/net/SigmaStudioTcpServer). + */ +void sigma_studio_lock(void); + +/** @brief Release the lock acquired by sigma_studio_lock(). */ +void sigma_studio_unlock(void); + /** * @brief Write a contiguous register/data block to the ADAU1701. * @@ -44,6 +59,16 @@ void SIGMA_WRITE_REGISTER_BLOCK(unsigned char devAddress, unsigned int length, ADI_REG_TYPE* pData); +/** + * @brief Read a contiguous register/data block from the ADAU1701. + * + * @param reg 16-bit source address in DSP memory map. + * @param data Destination buffer. + * @param length Number of bytes to read. + * @return 0 on success, non-zero on I2C failure. + */ +int sigma_i2c_read(unsigned int reg, unsigned char* data, unsigned int length); + /** Safeload data register base (0x0810..0x0814). */ #define ADAU1701_SAFELOAD_DATA_BASE 0x0810U /** Safeload address register base (0x0815..0x0819). */ @@ -73,6 +98,22 @@ int sigma_safeload_param(unsigned int paramAddr, int fixpoint); int sigma_safeload_block(unsigned char count, const unsigned int* paramAddrs, const int* fixpoints); +/** + * @brief Safeload up to five parameters from raw wire bytes (pass-through). + * + * Used by the SigmaStudio TCP bridge: unlike sigma_safeload_block(), which + * reconstructs the 4-byte payload from a host int, this forwards each + * 4-byte word exactly as received over the network — no endianness + * reinterpretation. + * + * @param count Number of words (1..5). + * @param paramAddrs Parameter RAM addresses. + * @param rawWords count*4 raw bytes, one 4-byte word per address. + * @return 0 on success, non-zero on I2C failure. + */ +int sigma_safeload_raw_block(unsigned char count, const unsigned int* paramAddrs, + const unsigned char* rawWords); + #ifdef __cplusplus } #endif diff --git a/Software/Firmware/ADAU1701-Firmware/TxBuffer_IC_1.dat b/Software/Firmware/ADAU1701-Firmware/TxBuffer_IC_1.dat index 9b0190d..1355be3 100644 --- a/Software/Firmware/ADAU1701-Firmware/TxBuffer_IC_1.dat +++ b/Software/Firmware/ADAU1701-Firmware/TxBuffer_IC_1.dat @@ -13,310 +13,332 @@ 0x00, 0x20, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0xE8, 0x01, -0x00, 0x12, 0x00, 0x20, 0x01, -0x00, 0x30, 0x00, 0xE2, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x1A, 0x01, 0x20, 0x01, +0x00, 0x02, 0x01, 0xA0, 0x01, +0xFF, 0xE1, 0x07, 0x20, 0x01, 0x00, 0x38, 0x00, 0xE2, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x22, 0x02, 0x20, 0x01, -0x00, 0x40, 0x00, 0xE2, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x2A, 0x03, 0x20, 0x01, +0x00, 0x42, 0x02, 0x20, 0x01, +0x00, 0x52, 0x00, 0x22, 0x01, +0x00, 0x58, 0x00, 0xE2, 0x01, +0x00, 0x42, 0x00, 0x20, 0x01, +0x00, 0x59, 0x08, 0x22, 0x41, +0x00, 0x39, 0x08, 0x22, 0x01, +0x00, 0x31, 0x08, 0x22, 0x41, 0x00, 0x48, 0x00, 0xE2, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x32, 0x04, 0x20, 0x01, -0x00, 0x3A, 0x04, 0x40, 0x01, -0x00, 0x42, 0x05, 0x22, 0x01, -0x00, 0x4A, 0x05, 0x44, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x12, 0x03, 0x20, 0x01, 0x00, 0x60, 0x00, 0xE2, 0x01, -0x01, 0x98, 0x00, 0xE4, 0x01, -0x00, 0x8A, 0x09, 0x20, 0x01, -0x00, 0x82, 0x0A, 0x22, 0x01, -0x00, 0x72, 0x09, 0x34, 0x01, -0x00, 0x6A, 0x0A, 0x22, 0x01, -0x00, 0x62, 0x06, 0x22, 0x01, -0x00, 0x5A, 0x07, 0x22, 0x01, -0x00, 0x52, 0x08, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x1A, 0x04, 0x20, 0x01, +0x00, 0x68, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x22, 0x05, 0x20, 0x01, +0x00, 0x70, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x2A, 0x06, 0x20, 0x01, 0x00, 0x78, 0x00, 0xE2, 0x01, -0x00, 0x90, 0x00, 0xF2, 0x01, -0x00, 0xBA, 0x0E, 0x20, 0x01, -0x00, 0xB2, 0x0F, 0x22, 0x01, -0x00, 0xA2, 0x0E, 0x34, 0x01, -0x00, 0x9A, 0x0F, 0x22, 0x01, -0x00, 0x7A, 0x0B, 0x22, 0x01, -0x00, 0x72, 0x0C, 0x22, 0x01, -0x00, 0x6A, 0x0D, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x5A, 0x07, 0x20, 0x01, +0x00, 0x80, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x82, 0x08, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x88, 0x00, 0xE2, 0x01, +0x00, 0x82, 0x08, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x90, 0x00, 0xE2, 0x01, +0x00, 0x62, 0x09, 0x20, 0x01, +0x00, 0x6A, 0x09, 0x40, 0x01, +0x00, 0x72, 0x0A, 0x22, 0x01, +0x00, 0x7A, 0x0A, 0x44, 0x01, +0x00, 0x8A, 0x0B, 0x22, 0x01, +0x00, 0x92, 0x0B, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA8, 0x00, 0xE2, 0x01, -0x00, 0xC0, 0x00, 0xF2, 0x01, -0x00, 0xEA, 0x13, 0x20, 0x01, -0x00, 0xE2, 0x14, 0x22, 0x01, -0x00, 0xD2, 0x13, 0x34, 0x01, -0x00, 0xCA, 0x14, 0x22, 0x01, -0x00, 0xAA, 0x10, 0x22, 0x01, -0x00, 0xA2, 0x11, 0x22, 0x01, -0x00, 0x9A, 0x12, 0x22, 0x01, +0x01, 0xE0, 0x00, 0xE4, 0x01, +0x00, 0xD2, 0x0F, 0x20, 0x01, +0x00, 0xCA, 0x10, 0x22, 0x01, +0x00, 0xBA, 0x0F, 0x34, 0x01, +0x00, 0xB2, 0x10, 0x22, 0x01, +0x00, 0xAA, 0x0C, 0x22, 0x01, +0x00, 0xA2, 0x0D, 0x22, 0x01, +0x00, 0x9A, 0x0E, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0xD8, 0x00, 0xE2, 0x01, -0x00, 0xF0, 0x00, 0xF2, 0x01, -0x01, 0x1A, 0x18, 0x20, 0x01, -0x01, 0x12, 0x19, 0x22, 0x01, -0x01, 0x02, 0x18, 0x34, 0x01, -0x00, 0xFA, 0x19, 0x22, 0x01, -0x00, 0xDA, 0x15, 0x22, 0x01, -0x00, 0xD2, 0x16, 0x22, 0x01, -0x00, 0xCA, 0x17, 0x22, 0x01, +0x00, 0xC0, 0x00, 0xE2, 0x01, +0x00, 0xD8, 0x00, 0xF2, 0x01, +0x01, 0x02, 0x14, 0x20, 0x01, +0x00, 0xFA, 0x15, 0x22, 0x01, +0x00, 0xEA, 0x14, 0x34, 0x01, +0x00, 0xE2, 0x15, 0x22, 0x01, +0x00, 0xC2, 0x11, 0x22, 0x01, +0x00, 0xBA, 0x12, 0x22, 0x01, +0x00, 0xB2, 0x13, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x08, 0x00, 0xE2, 0x01, -0x01, 0x20, 0x00, 0xF2, 0x01, -0x01, 0x4A, 0x1D, 0x20, 0x01, -0x01, 0x42, 0x1E, 0x22, 0x01, -0x01, 0x32, 0x1D, 0x34, 0x01, -0x01, 0x2A, 0x1E, 0x22, 0x01, -0x01, 0x0A, 0x1A, 0x22, 0x01, -0x01, 0x02, 0x1B, 0x22, 0x01, -0x00, 0xFA, 0x1C, 0x22, 0x01, +0x00, 0xF0, 0x00, 0xE2, 0x01, +0x01, 0x08, 0x00, 0xF2, 0x01, +0x01, 0x32, 0x19, 0x20, 0x01, +0x01, 0x2A, 0x1A, 0x22, 0x01, +0x01, 0x1A, 0x19, 0x34, 0x01, +0x01, 0x12, 0x1A, 0x22, 0x01, +0x00, 0xF2, 0x16, 0x22, 0x01, +0x00, 0xEA, 0x17, 0x22, 0x01, +0x00, 0xE2, 0x18, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x38, 0x00, 0xE2, 0x01, -0x01, 0x50, 0x00, 0xF2, 0x01, -0x01, 0x7A, 0x22, 0x20, 0x01, -0x01, 0x72, 0x23, 0x22, 0x01, -0x01, 0x62, 0x22, 0x34, 0x01, -0x01, 0x5A, 0x23, 0x22, 0x01, -0x01, 0x3A, 0x1F, 0x22, 0x01, -0x01, 0x32, 0x20, 0x22, 0x01, -0x01, 0x2A, 0x21, 0x22, 0x01, +0x01, 0x20, 0x00, 0xE2, 0x01, +0x01, 0x38, 0x00, 0xF2, 0x01, +0x01, 0x62, 0x1E, 0x20, 0x01, +0x01, 0x5A, 0x1F, 0x22, 0x01, +0x01, 0x4A, 0x1E, 0x34, 0x01, +0x01, 0x42, 0x1F, 0x22, 0x01, +0x01, 0x22, 0x1B, 0x22, 0x01, +0x01, 0x1A, 0x1C, 0x22, 0x01, +0x01, 0x12, 0x1D, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x68, 0x00, 0xE2, 0x01, -0x01, 0x80, 0x00, 0xF2, 0x01, -0x01, 0xC2, 0x09, 0x20, 0x01, -0x01, 0xBA, 0x0A, 0x22, 0x01, -0x01, 0xAA, 0x09, 0x34, 0x01, -0x01, 0xA2, 0x0A, 0x22, 0x01, -0x01, 0x9A, 0x06, 0x22, 0x01, -0x01, 0x92, 0x07, 0x22, 0x01, -0x01, 0x8A, 0x08, 0x22, 0x01, +0x01, 0x50, 0x00, 0xE2, 0x01, +0x01, 0x68, 0x00, 0xF2, 0x01, +0x01, 0x92, 0x23, 0x20, 0x01, +0x01, 0x8A, 0x24, 0x22, 0x01, +0x01, 0x7A, 0x23, 0x34, 0x01, +0x01, 0x72, 0x24, 0x22, 0x01, +0x01, 0x52, 0x20, 0x22, 0x01, +0x01, 0x4A, 0x21, 0x22, 0x01, +0x01, 0x42, 0x22, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x80, 0x00, 0xE2, 0x01, +0x01, 0x98, 0x00, 0xF2, 0x01, +0x01, 0xC2, 0x28, 0x20, 0x01, +0x01, 0xBA, 0x29, 0x22, 0x01, +0x01, 0xAA, 0x28, 0x34, 0x01, +0x01, 0xA2, 0x29, 0x22, 0x01, +0x01, 0x82, 0x25, 0x22, 0x01, +0x01, 0x7A, 0x26, 0x22, 0x01, +0x01, 0x72, 0x27, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xB0, 0x00, 0xE2, 0x01, 0x01, 0xC8, 0x00, 0xF2, 0x01, -0x01, 0xF2, 0x0E, 0x20, 0x01, -0x01, 0xEA, 0x0F, 0x22, 0x01, -0x01, 0xDA, 0x0E, 0x34, 0x01, -0x01, 0xD2, 0x0F, 0x22, 0x01, -0x01, 0xB2, 0x0B, 0x22, 0x01, -0x01, 0xAA, 0x0C, 0x22, 0x01, -0x01, 0xA2, 0x0D, 0x22, 0x01, +0x02, 0x0A, 0x0F, 0x20, 0x01, +0x02, 0x02, 0x10, 0x22, 0x01, +0x01, 0xF2, 0x0F, 0x34, 0x01, +0x01, 0xEA, 0x10, 0x22, 0x01, +0x01, 0xE2, 0x0C, 0x22, 0x01, +0x01, 0xDA, 0x0D, 0x22, 0x01, +0x01, 0xD2, 0x0E, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0xE0, 0x00, 0xE2, 0x01, -0x01, 0xF8, 0x00, 0xF2, 0x01, -0x02, 0x22, 0x13, 0x20, 0x01, -0x02, 0x1A, 0x14, 0x22, 0x01, -0x02, 0x0A, 0x13, 0x34, 0x01, -0x02, 0x02, 0x14, 0x22, 0x01, -0x01, 0xE2, 0x10, 0x22, 0x01, -0x01, 0xDA, 0x11, 0x22, 0x01, -0x01, 0xD2, 0x12, 0x22, 0x01, +0x01, 0xF8, 0x00, 0xE2, 0x01, +0x02, 0x10, 0x00, 0xF2, 0x01, +0x02, 0x3A, 0x14, 0x20, 0x01, +0x02, 0x32, 0x15, 0x22, 0x01, +0x02, 0x22, 0x14, 0x34, 0x01, +0x02, 0x1A, 0x15, 0x22, 0x01, +0x01, 0xFA, 0x11, 0x22, 0x01, +0x01, 0xF2, 0x12, 0x22, 0x01, +0x01, 0xEA, 0x13, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0x10, 0x00, 0xE2, 0x01, -0x02, 0x28, 0x00, 0xF2, 0x01, -0x02, 0x52, 0x18, 0x20, 0x01, -0x02, 0x4A, 0x19, 0x22, 0x01, -0x02, 0x3A, 0x18, 0x34, 0x01, -0x02, 0x32, 0x19, 0x22, 0x01, -0x02, 0x12, 0x15, 0x22, 0x01, -0x02, 0x0A, 0x16, 0x22, 0x01, -0x02, 0x02, 0x17, 0x22, 0x01, +0x02, 0x28, 0x00, 0xE2, 0x01, +0x02, 0x40, 0x00, 0xF2, 0x01, +0x02, 0x6A, 0x19, 0x20, 0x01, +0x02, 0x62, 0x1A, 0x22, 0x01, +0x02, 0x52, 0x19, 0x34, 0x01, +0x02, 0x4A, 0x1A, 0x22, 0x01, +0x02, 0x2A, 0x16, 0x22, 0x01, +0x02, 0x22, 0x17, 0x22, 0x01, +0x02, 0x1A, 0x18, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0x40, 0x00, 0xE2, 0x01, -0x02, 0x58, 0x00, 0xF2, 0x01, -0x02, 0x82, 0x1D, 0x20, 0x01, -0x02, 0x7A, 0x1E, 0x22, 0x01, -0x02, 0x6A, 0x1D, 0x34, 0x01, -0x02, 0x62, 0x1E, 0x22, 0x01, -0x02, 0x42, 0x1A, 0x22, 0x01, -0x02, 0x3A, 0x1B, 0x22, 0x01, -0x02, 0x32, 0x1C, 0x22, 0x01, +0x02, 0x58, 0x00, 0xE2, 0x01, +0x02, 0x70, 0x00, 0xF2, 0x01, +0x02, 0x9A, 0x1E, 0x20, 0x01, +0x02, 0x92, 0x1F, 0x22, 0x01, +0x02, 0x82, 0x1E, 0x34, 0x01, +0x02, 0x7A, 0x1F, 0x22, 0x01, +0x02, 0x5A, 0x1B, 0x22, 0x01, +0x02, 0x52, 0x1C, 0x22, 0x01, +0x02, 0x4A, 0x1D, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0x70, 0x00, 0xE2, 0x01, -0x02, 0x88, 0x00, 0xF2, 0x01, -0x02, 0xB2, 0x22, 0x20, 0x01, -0x02, 0xAA, 0x23, 0x22, 0x01, -0x02, 0x9A, 0x22, 0x34, 0x01, -0x02, 0x92, 0x23, 0x22, 0x01, -0x02, 0x72, 0x1F, 0x22, 0x01, -0x02, 0x6A, 0x20, 0x22, 0x01, -0x02, 0x62, 0x21, 0x22, 0x01, +0x02, 0x88, 0x00, 0xE2, 0x01, +0x02, 0xA0, 0x00, 0xF2, 0x01, +0x02, 0xCA, 0x23, 0x20, 0x01, +0x02, 0xC2, 0x24, 0x22, 0x01, +0x02, 0xB2, 0x23, 0x34, 0x01, +0x02, 0xAA, 0x24, 0x22, 0x01, +0x02, 0x8A, 0x20, 0x22, 0x01, +0x02, 0x82, 0x21, 0x22, 0x01, +0x02, 0x7A, 0x22, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xA0, 0x00, 0xE2, 0x01, -0x02, 0xB8, 0x00, 0xF2, 0x01, -0x01, 0x6A, 0x24, 0x20, 0x01, -0x02, 0xC0, 0x00, 0xE2, 0x01, +0x02, 0xB8, 0x00, 0xE2, 0x01, +0x02, 0xD0, 0x00, 0xF2, 0x01, +0x02, 0xFA, 0x28, 0x20, 0x01, +0x02, 0xF2, 0x29, 0x22, 0x01, +0x02, 0xE2, 0x28, 0x34, 0x01, +0x02, 0xDA, 0x29, 0x22, 0x01, +0x02, 0xBA, 0x25, 0x22, 0x01, +0x02, 0xB2, 0x26, 0x22, 0x01, +0x02, 0xAA, 0x27, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xA2, 0x25, 0x20, 0x01, -0x02, 0xC8, 0x00, 0xE2, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xC1, 0x08, 0x20, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x28, 0x00, 0xF0, 0x01, -0xFF, 0xE9, 0x08, 0x22, 0x01, -0x03, 0x20, 0x00, 0xF2, 0x01, -0x03, 0x11, 0x08, 0x20, 0x01, -0x03, 0x12, 0x32, 0x22, 0x41, -0x03, 0x22, 0x32, 0x22, 0x01, -0x03, 0x01, 0x08, 0x34, 0x01, -0x03, 0x02, 0x32, 0x22, 0x41, -0x03, 0x2A, 0x32, 0x22, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x08, 0x00, 0xE2, 0x01, -0x03, 0x18, 0x00, 0xF2, 0x01, -0x03, 0x30, 0x00, 0xE2, 0x01, -0xFF, 0xF2, 0x2E, 0x40, 0x01, -0x03, 0x31, 0x08, 0x20, 0x09, -0x03, 0x32, 0x26, 0x20, 0x01, -0xFF, 0xF2, 0x27, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x03, 0x32, 0x28, 0x20, 0x01, -0xFF, 0xF2, 0x29, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x23, -0xFF, 0xF2, 0x2F, 0x40, 0x01, -0x03, 0x31, 0x08, 0x20, 0x09, -0x03, 0x32, 0x2A, 0x20, 0x01, -0xFF, 0xF2, 0x2B, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x23, -0xFF, 0xF2, 0x30, 0x40, 0x01, -0x03, 0x31, 0x08, 0x20, 0x09, -0x03, 0x32, 0x2C, 0x20, 0x01, -0xFF, 0xF2, 0x2D, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x23, -0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x03, 0x37, 0xFF, 0x20, 0x41, -0xFF, 0xF1, 0x07, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD7, 0xFF, 0x20, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x03, 0x37, 0xFF, 0x20, 0x41, -0xFF, 0xF1, 0x07, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD7, 0xFF, 0x20, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x03, 0x37, 0xFF, 0x20, 0x41, -0xFF, 0xF1, 0x07, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD7, 0xFF, 0x20, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x00, 0x02, 0x31, 0xA0, 0x01, -0xFF, 0xE7, 0xFF, 0x20, 0x01, -0x02, 0xF8, 0x00, 0xE2, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xF9, 0x08, 0x40, 0x01, -0xFF, 0xF1, 0x08, 0x20, 0x09, -0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xF8, 0x00, 0xE2, 0x23, -0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xF9, 0x08, 0x40, 0x01, -0x02, 0xF1, 0x08, 0x20, 0x09, -0x02, 0xFA, 0x33, 0x20, 0x01, -0x02, 0xF2, 0x33, 0x22, 0x41, -0x02, 0xF1, 0x08, 0x22, 0x01, -0x02, 0xF8, 0x00, 0xE2, 0x23, -0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xF9, 0x08, 0x20, 0x01, 0x02, 0xE8, 0x00, 0xE2, 0x01, -0xFF, 0xF2, 0x34, 0x22, 0x49, -0xFF, 0xF1, 0x08, 0x20, 0x01, -0xFF, 0xE9, 0x08, 0x20, 0x25, -0x02, 0xE0, 0x00, 0xE2, 0x01, -0x02, 0xF8, 0x00, 0xC0, 0x01, -0x02, 0xC7, 0xFF, 0x20, 0x01, -0x02, 0xD8, 0x00, 0xE2, 0x01, -0x02, 0xC9, 0x08, 0x20, 0x01, +0x03, 0x00, 0x00, 0xF2, 0x01, +0x01, 0xB2, 0x2A, 0x20, 0x01, +0x03, 0x08, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x28, 0x00, 0xF0, 0x01, +0x02, 0xEA, 0x2B, 0x20, 0x01, +0x03, 0x10, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x09, 0x08, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x70, 0x00, 0xF0, 0x01, 0xFF, 0xE9, 0x08, 0x22, 0x01, -0x03, 0x20, 0x00, 0xF2, 0x01, -0x03, 0x71, 0x08, 0x20, 0x01, -0x03, 0x72, 0x41, 0x22, 0x41, -0x03, 0x22, 0x41, 0x22, 0x01, -0x03, 0x61, 0x08, 0x34, 0x01, -0x03, 0x62, 0x41, 0x22, 0x41, -0x03, 0x2A, 0x41, 0x22, 0x01, +0x03, 0x68, 0x00, 0xF2, 0x01, +0x03, 0x59, 0x08, 0x20, 0x01, +0x03, 0x5A, 0x38, 0x22, 0x41, +0x03, 0x6A, 0x38, 0x22, 0x01, +0x03, 0x49, 0x08, 0x34, 0x01, +0x03, 0x4A, 0x38, 0x22, 0x41, +0x03, 0x72, 0x38, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x68, 0x00, 0xE2, 0x01, -0x03, 0x78, 0x00, 0xF2, 0x01, -0x03, 0x30, 0x00, 0xE2, 0x01, -0xFF, 0xF2, 0x3D, 0x40, 0x01, -0x03, 0x31, 0x08, 0x20, 0x09, -0x03, 0x32, 0x35, 0x20, 0x01, -0xFF, 0xF2, 0x36, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x03, 0x32, 0x37, 0x20, 0x01, -0xFF, 0xF2, 0x38, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x23, -0xFF, 0xF2, 0x3E, 0x40, 0x01, -0x03, 0x31, 0x08, 0x20, 0x09, -0x03, 0x32, 0x39, 0x20, 0x01, -0xFF, 0xF2, 0x3A, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x23, -0xFF, 0xF2, 0x3F, 0x40, 0x01, -0x03, 0x31, 0x08, 0x20, 0x09, -0x03, 0x32, 0x3B, 0x20, 0x01, -0xFF, 0xF2, 0x3C, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x23, +0x03, 0x50, 0x00, 0xE2, 0x01, +0x03, 0x60, 0x00, 0xF2, 0x01, +0x03, 0x78, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x34, 0x40, 0x01, +0x03, 0x79, 0x08, 0x20, 0x09, +0x03, 0x7A, 0x2C, 0x20, 0x01, +0xFF, 0xF2, 0x2D, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x7A, 0x2E, 0x20, 0x01, +0xFF, 0xF2, 0x2F, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x35, 0x40, 0x01, +0x03, 0x79, 0x08, 0x20, 0x09, +0x03, 0x7A, 0x30, 0x20, 0x01, +0xFF, 0xF2, 0x31, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x36, 0x40, 0x01, +0x03, 0x79, 0x08, 0x20, 0x09, +0x03, 0x7A, 0x32, 0x20, 0x01, +0xFF, 0xF2, 0x33, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x03, 0x37, 0xFF, 0x20, 0x41, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x03, 0x7F, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD7, 0xFF, 0x20, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x03, 0x37, 0xFF, 0x20, 0x41, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x1F, 0xFF, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x03, 0x7F, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD7, 0xFF, 0x20, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x03, 0x37, 0xFF, 0x20, 0x41, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x1F, 0xFF, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x03, 0x7F, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD7, 0xFF, 0x20, 0x01, -0x02, 0xD0, 0x00, 0xE2, 0x01, -0x02, 0xD0, 0x00, 0xC0, 0x01, -0x00, 0x02, 0x40, 0xA0, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x1F, 0xFF, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x00, 0x02, 0x37, 0xA0, 0x01, 0xFF, 0xE7, 0xFF, 0x20, 0x01, -0x03, 0x58, 0x00, 0xE2, 0x01, +0x03, 0x40, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x59, 0x08, 0x40, 0x01, +0x03, 0x41, 0x08, 0x40, 0x01, 0xFF, 0xF1, 0x08, 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x58, 0x00, 0xE2, 0x23, +0x03, 0x40, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x59, 0x08, 0x40, 0x01, -0x03, 0x51, 0x08, 0x20, 0x09, -0x03, 0x5A, 0x42, 0x20, 0x01, -0x03, 0x52, 0x42, 0x22, 0x41, -0x03, 0x51, 0x08, 0x22, 0x01, -0x03, 0x58, 0x00, 0xE2, 0x23, +0x03, 0x41, 0x08, 0x40, 0x01, +0x03, 0x39, 0x08, 0x20, 0x09, +0x03, 0x42, 0x39, 0x20, 0x01, +0x03, 0x3A, 0x39, 0x22, 0x41, +0x03, 0x39, 0x08, 0x22, 0x01, +0x03, 0x40, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x59, 0x08, 0x20, 0x01, -0x03, 0x48, 0x00, 0xE2, 0x01, -0xFF, 0xF2, 0x43, 0x22, 0x49, +0x03, 0x41, 0x08, 0x20, 0x01, +0x03, 0x30, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x3A, 0x22, 0x49, 0xFF, 0xF1, 0x08, 0x20, 0x01, 0xFF, 0xE9, 0x08, 0x20, 0x25, -0x03, 0x40, 0x00, 0xE2, 0x01, -0x03, 0x58, 0x00, 0xC0, 0x01, -0x02, 0xCF, 0xFF, 0x20, 0x01, -0x03, 0x38, 0x00, 0xE2, 0x01, -0x03, 0x39, 0x08, 0x20, 0x01, +0x03, 0x28, 0x00, 0xE2, 0x01, +0x03, 0x40, 0x00, 0xC0, 0x01, +0x03, 0x0F, 0xFF, 0x20, 0x01, +0x03, 0x20, 0x00, 0xE2, 0x01, +0x03, 0x11, 0x08, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x70, 0x00, 0xF0, 0x01, +0xFF, 0xE9, 0x08, 0x22, 0x01, +0x03, 0x68, 0x00, 0xF2, 0x01, +0x03, 0xB9, 0x08, 0x20, 0x01, +0x03, 0xBA, 0x47, 0x22, 0x41, +0x03, 0x6A, 0x47, 0x22, 0x01, +0x03, 0xA9, 0x08, 0x34, 0x01, +0x03, 0xAA, 0x47, 0x22, 0x41, +0x03, 0x72, 0x47, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0xB0, 0x00, 0xE2, 0x01, +0x03, 0xC0, 0x00, 0xF2, 0x01, +0x03, 0x78, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x43, 0x40, 0x01, +0x03, 0x79, 0x08, 0x20, 0x09, +0x03, 0x7A, 0x3B, 0x20, 0x01, +0xFF, 0xF2, 0x3C, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x7A, 0x3D, 0x20, 0x01, +0xFF, 0xF2, 0x3E, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x44, 0x40, 0x01, +0x03, 0x79, 0x08, 0x20, 0x09, +0x03, 0x7A, 0x3F, 0x20, 0x01, +0xFF, 0xF2, 0x40, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x45, 0x40, 0x01, +0x03, 0x79, 0x08, 0x20, 0x09, +0x03, 0x7A, 0x41, 0x20, 0x01, +0xFF, 0xF2, 0x42, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x03, 0x7F, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x1F, 0xFF, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x03, 0x7F, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x1F, 0xFF, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x03, 0x7F, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x1F, 0xFF, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0x03, 0x18, 0x00, 0xC0, 0x01, +0x00, 0x02, 0x46, 0xA0, 0x01, +0xFF, 0xE7, 0xFF, 0x20, 0x01, +0x03, 0xA0, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0xA1, 0x08, 0x40, 0x01, +0xFF, 0xF1, 0x08, 0x20, 0x09, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0xA0, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0xA1, 0x08, 0x40, 0x01, +0x03, 0x99, 0x08, 0x20, 0x09, +0x03, 0xA2, 0x48, 0x20, 0x01, +0x03, 0x9A, 0x48, 0x22, 0x41, +0x03, 0x99, 0x08, 0x22, 0x01, +0x03, 0xA0, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0xA1, 0x08, 0x20, 0x01, +0x03, 0x90, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x49, 0x22, 0x49, +0xFF, 0xF1, 0x08, 0x20, 0x01, +0xFF, 0xE9, 0x08, 0x20, 0x25, +0x03, 0x88, 0x00, 0xE2, 0x01, +0x03, 0xA0, 0x00, 0xC0, 0x01, +0x03, 0x17, 0xFF, 0x20, 0x01, +0x03, 0x80, 0x00, 0xE2, 0x01, +0x03, 0x81, 0x08, 0x20, 0x01, 0xFF, 0x30, 0x00, 0x02, 0x01, -0x02, 0xD9, 0x08, 0x20, 0x01, +0x03, 0x21, 0x08, 0x20, 0x01, 0xFF, 0x28, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, @@ -1003,29 +1025,13 @@ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, /* (2) Param */ +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x6C, 0xAC, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, @@ -2044,14 +2050,8 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, /* (3) IC 1.HWConFiguration */ -0x00, 0x18, 0x08, 0x08, 0x00, +0x00, 0x18, 0x0B, 0x08, 0x00, 0x00, 0x44, 0x00, 0x44, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, diff --git a/Software/Firmware/ADAU1701-Firmware/defines.h b/Software/Firmware/ADAU1701-Firmware/defines.h index 006afb8..6719fa9 100644 --- a/Software/Firmware/ADAU1701-Firmware/defines.h +++ b/Software/Firmware/ADAU1701-Firmware/defines.h @@ -1,7 +1,7 @@ /* * File: defines.h * - * Created: Monday, July 6, 2026 2:41:28 PM + * Created: Friday, August 7, 2026 3:19:11 AM * Description: DigiRadio IC default download data definitions. * * This software is distributed in the hope that it will be useful, diff --git a/Software/Sigmastudio/DigiRadio.dspproj b/Software/Sigmastudio/DigiRadio.dspproj new file mode 100644 index 0000000000000000000000000000000000000000..1033dbb875e3c8fd26ab5e64417faf70abb5d502 GIT binary patch literal 49977 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 literal 0 HcmV?d00001 diff --git a/Software/Sigmastudio/DigiRadio.zip b/Software/Sigmastudio/DigiRadio.zip new file mode 100644 index 0000000000000000000000000000000000000000..634a74bd5a1a2f84a5bb7582b8a8a752470262c7 GIT binary patch literal 22744 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 literal 0 HcmV?d00001 diff --git a/Software/Sigmastudio/DigiRadioTest.zip b/Software/Sigmastudio/DigiRadioTest.zip new file mode 100644 index 0000000000000000000000000000000000000000..ca93f85be79205d1e8832f9403d99ce9687210a1 GIT binary patch literal 22126 zcmc$_1ymf-mNrTtNFYcE?!lel?(Xgu+}*7S9^BpC-912Xcc+6(V~snH7%&ERZ0GAVe(8ER+n4E$mcG zoSYe4+z}w&z5i4Fw@_6K4@Zb)O9(g-5W-UU?7Y8kLZ_d#bBe8Nec>0U~(n&_` zIbP2l=ngxpDE@2~{C=Uj$8JKlQq(ReuE&kumAF`jk|-2eSl7(2H2)aQx~2}?2~D)23-?UJmi<2COoZqr>7i@z@YpCt|dqNVD_qT$oKP$RZ@_N z_Jo)MVO}Zy&{V|kB)inB3FjF59vMl-iULX5D=~#mN^!KJqo`X~_<%TP0t1#+>Vius z{$1i5ABvdhLrdxth_Vmg7e%uwVz4KN5U7BH78-F(x@gd}^>~IFgC3G`q;90)%K z+gBO#dbn^(%I*y%?Xl*|%BH;AU>5gAd&XE17lZElY2sAmHx1XGu;jaRNlRCgTOfiL z3~~cbO}D<3^lZTCgm)`Q!@`kAd0U}CLO=vTK|uW1lMeSkO}c-d&h+Lc?*G-q`!nhO z>?d>5wgF$!pr0E^!v@~a-V38+D|PaiPos$4Z>E^RC)clr zhn(K*)|hD&;Z*g!zS3Q)`-5@O!f;%)&qk5`S4sMyWqfdfPx^x8FmTPxjy}X};3*j2 zTQYK_1OQO+N}EvBFjP^FD4eh=rygkFW7%&UO^MpWQPx{MH7~=TIbq8L){a{Baf)JY zcK)U~{At3k{Ltt;?-;TnnuHA|RR`BMw z$cXQ`0gcUc1pk0*ApwNnx>S18s*0CZYrl=+@E|I6;Va;zR`UA=j_}Er6ua&+txn2d z0PopXjy`8LCp|Lt()x~0d-~$856|_p?87`>hOrZbKN0pPjXf)k^smjb^>vR_XR~GY z4%c-}JLW@PWle!fk29=3S+uD8_sgYi>PN`p>*B7Z1W9Ja{oR|BJ5J5}m)aBTZQk3h ztXm$d+tB!-`*zW0D=*HN6a80wnV^$T4E3+Fb`?WPmYXC<+~`W?!zH^ht~3(|gkN^j zk5f03ceKj=?1=|gq002|#JLofHL-%K911%o2q}*E@K)!i>S;b3myU${rs$i>5#l>)P9jBbrM$U5|ZA=5ab#J#bIZ`jugNVktZNcryEFsnM-1% z{;a4>M;DAyHp{GvN7#kg9(xmMMvWX}egZM=AY3~ya4>b%C2GZ5sHMs3bRkINpy&G?2la?OzcR5ALw z9W3|#p>^9ro^7pKGj?VcMxi*JcuF6#0GpqVy;6VceF<8)3ObtA80s!opY_HS8qfqg z18R5IkN4Po7-R_Ug`Pc%Jf$9O(Ncz(v!b>X;P@u`qQviK@OMUI7gf#=U0lUK(kB*V z;ja8v%z<2tE?-%7x!lcxq<5WJ)rSc)gsDHe)jeuEgT!ECZ~6%Wa$xjXp zN-+E|mcDe`SUvWTkvY|(h!A@z?3JWfxQOtj<0_~s8GqGpAvdab{Ja&4k{O>iJxN~zr)cUM*?`KMUb&zV^>;?5%%pdV7Bdq4jQu>WbR?F)!Y-5XH+1~ zz4Dhp)vQ3f`Ulw_GOz|Q%|85YuyvAd4O-c_`R(j>9M)6%smx?MVAhi=D60?7q!!#` z(U~xFPd@I{#LKas*|zX|PQod?`$7f$1&!iEt@`61O8A=L`@eeFuAV zVmUkI_{L_Aem=gSwb@aqe>wwQZ7&|#KfXX}p`U`$)Ubny&pUt*ivQeJoRV1_Gg`w z=zXCaW5TcbG! zub^GenpQ-Ta7SE+`v|JXXh2JAB-o=BDg65WPEe$uL~nVU!3%KfU^kj&gIBR{Pk5_# zX3eO3>jdtw0YOFA?ryv&^b;(^Hbk0q^X<*<&z{-y2MZ9Pz`cj``~T$dLntG&OLA{m zwM}Awf>e`qqB#BDX@7TWdLq8(iYwK3lCV_@V`7~+m7!=cJM;MEq|YjD*f?uro%6`z z#&-9lU~592vhwnEPO^#mw1QICO1ryx#C2suuHkwafAyoLQNjpc>qI@Qe1c6Ytg4;1 zXceq#j>)Q3<3p6^C^v>S_cucBG6{Ll8N!N@s)3CQig4SVU#^(JJ4Phjc!<)ULvbx@ObdNvqVetC^k^YW<&SP70ILDS;*K zR*lQ3ZECBamF%XInCm2Nevb;iCXt|-ttJAHf?_C#BZs5f86IE<&Ow0^4L(RH_y31O z**h242mU_^2Ja6Enrm1H2zTRm{||FKcN^>fD!cf%n~M`&kmGg}`b&0d2UJ^k+=Ldn z01B!0AokIMc^fD_qbM~~t}L;IjiT=0sIL7K_Zs^lpV=q3OGr|n&i;$V2*z=Rb6jdY zDH251S>HQ*xRIZ)FVETeXZ*m3=|Oic>6u}-YWqHqpsnGr_+;_rXL@vdgh>ACKtkW= z`ROwxq^Yy+7x-raT|EkB7HR%5e#9cikt*?FYd+ZxhCMJG*=LsSsA(5ZTrpm7ZjhHba`+)Hi=UQJ*85zun$54P$SAHcHCeiMKW4(<~-9FHDI zR9hI$%6RZP>Mq>4vNN}Abx}b26L8v)BRhAs-`SmasFASf5V4vp?c=~9y5%5YyaA6e zA=Br$h^IpvF8r~27{Rl%Dc!aq)OvW>aK*T)^3mnp#B;TjvF%~XYOZoaoJp8%tV7W{ zSNz=tSu@0WZ#`)wgSZK&_m27AZF2QxExMYZwcOPn=d4AZZn+{7K=QA8R=Uco8{0G; z-N|X+S5drPmcVL7J0|NK%1hWRtE5#NdHw+sz5dNbeSAFH%*t$?^^XruNJK9gpP0mb zeI8+aBnE1SW(oBM*|DYjj$uq*@vpT;X#j3aEuqm~bb--G_k{&qqZNFbYaP+WgHKdT z4pB&jB2*wz@5I>Lg3?BItwR>QT_%G5OR;>#U`JOOyli~@s#AC-lQo%W{MaCUE02d^ z{%s>i=b_hm=aU|9`(tm{jK!h*h=9d|gBS`)4J3r0c$ps<=zcZN<#yy*nlF91GBDqO zn&Oekz&U^?rI$Nwkk?$OSBEPCNxuqCw1r@h^=u0Pj!3})UA12t>cDOzpR6_`*m84 zb=5Ydc-YIRX&x}y#7SGxr92Pn-U@S8^}hPQCrwRq4^a!6 z6kZkEpg01paaE0B)%v*dDwgC_9hZ?kCi>MGJWI!U`gGy`W7?6lP8oC2u;tPB#EP!7 z9tuQd5!h|0@$l+O=@?@H#GTgk@ik~;0ZI+}3K-I^Nmq3yG%1}jmO+vGf~6|&)O#nS zs(38unOpNroUprH3pwX@M(EOo$&e8C1Y6O^^vIigi!O5nRE87PhgFHjO~};&%Q^$q zsVpIBI<_ph>uzGNG~NLWUQ48?up>-Z<4g zT>8mny7Ja2)fsb5h0E=Y15r%}n*|-+B-HvWknXEMRIS4HQPol%q}aVm zvZ(KF64VeiDHoAr_AlGSjZ(aXG3nV$Zq(F4$llpD>q!nD*^e6>SIetlDOT8Sg?7@^ zXgBREdw4DxD=TcOI}4wlX9YSGEDaD7c zS+K9>SrMTQ*7&rqavQ{yjb<{sRTdE|@+4D;wG>BHW(saf+cqvQ?SuFZw0*tL>6Q>UOZR~Dgcl+SGgmRW|0_ek2nG71q} z+u|AO%M&a^(wciwBU0*tDnz4#-yay2zR`&>Rh9vxM=G=|X&$@o428y7DRar<7E+=U z(jqa|Fohv`!NpkTPZK%Ykbun4bF@8y`Q)kmYr;#@#c7Jp*K>|H8n+qanP5EOq zQ_hmHp!~ z7!pq}d0Dj$fwHx?X6iE+nH>F8WQF%0ZAf^TSMml! zc`xqkQ#y>=maf;d7rWQgv66q6;idPNGSyYg>-A0~#S$D)8G0W;PEJlTOT-Wf`oI5x zO8UPBb}+vnOfXV%G~_%G1?VAc4j}V4&PcMiYRSM}l4h!8TM6K0^LjV=MeS_k_G`f1mf~mV}8tqm}kJ9t97;oXIiO7mO3pvh#XX}9!jL`viFD#_8xAygl_SZ-~(D&^2>bTEQL6aT}9he zr}h1((Qh3;qU+7V!{cE?ZF19ncYRIOX#}fONotfX&Mv1x3O#gru z&*wfeFIU2ih|YXTmDY1~cXpex(nZh%os=xX$1H@1x5Y<^(Q#;5#JFW&jygApe~fct}78JAzB+BEYSH@pd#a}cD+vclVQhV0j?iCaG?F%ND zyyWpy#od-T@2_ubbO_{!aGA*V!s8qzSZ*VbVZ#$t>z{gOSsZ@5jg=|8ZNN0@d?E8A z^O{E@X>otKyG78!by;S1**kSDbKq6uSNx`~UN9wp zt)Pxxw%O~(b{`kt*fb?XEewhkL@g2uF2q~gXow%G-!-6HSe!m6Kn8`rxA*XoBmFJ{ zD{*ly1}(wzT?9(P`TH*j^8yKv_X2s4q|^d=5D5YX>X0oRd~RgltB|HT#p}fmEa7w! zbIVDb5d+1-62ys|RRgQSrc_a+O1>td&{t2E2F4u0)xTF4mtYN45teWXoD=w~C{#vV zKrK{8l%QZBFZ8B(OB$FJ^;H_qIWQ}DY8J(lOK9?+M0wGJQaE1d+(3Bd51SVc8KuG& zt{^HR?6Xj6i6TE^9EqX;V;Bh%(Gd~>CUjC|K_=*e_a7fohjy=9tNpKBVgQ2D4>%I~ zP=_EQAE<&@;@wX~KIjE+Rp>FOU-2Y}k{9>=;F+cb_dJX8Ke8nF1v5=4!oW!V5mbPo z9uW}5rlce@=15R@>y0qFNlE?~s!m@1N7jVgV5T|6;D0iMsYetUh+*m?;`UKpWr{NYN7-ZL2z@xsmI6VZK)+a@AI(OS>g$Aq^u%$ZR7Vdkt?F({&e z95z-m^wHm5P$%&EC!AI6rv)LBiUBbug$fbz@^mKx$l(%QD3>h%$ccz+jt?NeIBcp^ zzfbf(5^D%(4d}FbwORt_-6dhd5`S2@IA!TmmX!LX!Akx*Uh+H-ygnHIm_26x0rS0r zMs!XMhL8bWaIYmwW7~M4U=+1F)S26 zj4|T#&o}nQ*H4-TDRa*RvC*icSDjPHkjQpU3BNzOarV6%HJN)C>=tKW7_!;c9m{S1 zOGSJ==6woNvW-_2LP0B1$WL&T<1vekxBa00i~PAeLC#gPAXSsF#d`J{=W5Ya4}W*LR&Ab=&8Jq}V4>AA*lCQR7e?h~K9woIKkQ+n=GCm2Q4S!@UJ z9MWtfe=^ID$y6ksK@yg=n-oC_`gH%3JZ8(YaLpY}_l86#M)sxqkIXNG2Du;PF7mb7ZO1s1%0D=fYaufJgx#6_UYHtQ`z%&V_aw^@o zane^ko&Hjs0`7bweih|ifuC-akF*Ya*T38%$TQ;KL1OK3Hp!L@pkH0bbTP-}w_)0tJpV!HiS$9^XVcNt)0$UvKYp6@MFkCeu(0-*w$q15ARMEc>7McH{wSaJcB)

y{TYU_V*J}CmV&0qcK9w7LCExX3dDZjhM?S4xvs<_c zzhqC=V18@6)?Lw6Ph=3f^uCs|3piTw3Vk)j40g{FSMmZky^gNV#?R{0YZp^IOXI#@ zd~s3lbEs4AptVHEoB}gN-!z|2NK^SYC41Hq>`E)KrBuDvB{R!X6(NnjYAnMK_JlvM z?sE`k4T5DeKDYQZS-s8_#YRpN4Dca6RmRiFO&`3#s3#AHSJKC4YU`5Us3mu{oy|Vh zw#gh<(t9=f%GJS^kN(;?s#CuW^5j=b4(*&bseUO1c-8!6)UQxXp7b3t)i$?{9d)^% z{X29y>;E^a&tGffAA-l(&YSfwH2gPc`Fh>YS3&cSq2-vqzD`?K`bM`gVk zhYA5v68Nu{zW&9tHGN58ea8R((fUay&~ZfqBcys!6%azdZyI+&E&=y3H7#5WHOdlI z_ybRs3{#;}M2%`dtn?4ks#1>}pGcp�QjFf7@XJS9VN(eU$uYr-!G*Q>Pf^BXx$T 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 BCF1}9 literal 0 HcmV?d00001 diff --git a/Software/Sigmastudio/DigiRadioTest/DigiRadio.hex b/Software/Sigmastudio/DigiRadioTest/DigiRadio.hex new file mode 100644 index 0000000..f903ffe --- /dev/null +++ b/Software/Sigmastudio/DigiRadioTest/DigiRadio.hex @@ -0,0 +1,1025 @@ +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x6C , 0xAC , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x7F , 0xC3 , 0x65 , +0x0F , 0x00 , 0x79 , 0x35 , +0x00 , 0x7F , 0xC3 , 0x65 , +0x00 , 0xFF , 0x86 , 0xAE , +0x0F , 0x80 , 0x79 , 0x19 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x0F , 0xFE , 0x2B , 0xE3 , +0x00 , 0x22 , 0xBE , 0x2C , +0x0F , 0xEA , 0xAA , 0xAB , +0x00 , 0x6A , 0xAA , 0xAB , +0x0F , 0x9A , 0x69 , 0xA7 , +0x00 , 0xFD , 0xF7 , 0xDF , +0x08 , 0x3C , 0x6C , 0x20 , +0x03 , 0xF5 , 0xAA , 0x23 , +0x01 , 0x80 , 0x00 , 0x00 , +0x01 , 0x00 , 0x00 , 0x00 , +0x00 , 0x33 , 0x33 , 0x33 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x07 , 0xDC , +0x00 , 0x00 , 0x08 , 0x00 , +0x00 , 0x7F , 0xF0 , 0x00 , +0x0F , 0xFE , 0x2B , 0xE3 , +0x00 , 0x22 , 0xBE , 0x2C , +0x0F , 0xEA , 0xAA , 0xAB , +0x00 , 0x6A , 0xAA , 0xAB , +0x0F , 0x9A , 0x69 , 0xA7 , +0x00 , 0xFD , 0xF7 , 0xDF , +0x08 , 0x3C , 0x6C , 0x20 , +0x03 , 0xF5 , 0xAA , 0x23 , +0x01 , 0x80 , 0x00 , 0x00 , +0x01 , 0x00 , 0x00 , 0x00 , +0x00 , 0x33 , 0x33 , 0x33 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x07 , 0xDC , +0x00 , 0x00 , 0x08 , 0x00 , +0x00 , 0x7F , 0xF0 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , + diff --git a/Software/Sigmastudio/DigiRadioTest/DigiRadio.params b/Software/Sigmastudio/DigiRadioTest/DigiRadio.params new file mode 100644 index 0000000..ce12f29 --- /dev/null +++ b/Software/Sigmastudio/DigiRadioTest/DigiRadio.params @@ -0,0 +1,2962 @@ +Cell Name = Si4674 +Parameter Name = Gain1940AlgNS1 +Parameter Address = 3 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + +Cell Name = Si4674 +Parameter Name = Gain1940AlgNS2 +Parameter Address = 4 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + +Cell Name = ESP32 +Parameter Name = Gain1940AlgNS3 +Parameter Address = 5 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + +Cell Name = ESP32 +Parameter Name = Gain1940AlgNS4 +Parameter Address = 6 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + +Cell Name = St Mixer1 +Parameter Name = StereoMixerAlg12 +Parameter Address = 7 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + +Cell Name = St Mixer1 +Parameter Name = StereoMixerAlg14 +Parameter Address = 8 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B1 +Parameter Address = 9 +Parameter Value = 0.99815046787262 +Parameter Data : +0x00 , 0x7F , 0xC3 , 0x65 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B1 +Parameter Address = 10 +Parameter Value = -1.99630105495453 +Parameter Data : +0x0F , 0x00 , 0x79 , 0x35 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B1 +Parameter Address = 11 +Parameter Value = 0.99815046787262 +Parameter Data : +0x00 , 0x7F , 0xC3 , 0x65 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A1 +Parameter Address = 12 +Parameter Value = 1.99629759788513 +Parameter Data : +0x00 , 0xFF , 0x86 , 0xAE , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A1 +Parameter Address = 13 +Parameter Value = -0.996304392814636 +Parameter Data : +0x0F , 0x80 , 0x79 , 0x19 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B2 +Parameter Address = 14 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B2 +Parameter Address = 15 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B2 +Parameter Address = 16 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A2 +Parameter Address = 17 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A2 +Parameter Address = 18 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B3 +Parameter Address = 19 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B3 +Parameter Address = 20 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B3 +Parameter Address = 21 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A3 +Parameter Address = 22 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A3 +Parameter Address = 23 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B4 +Parameter Address = 24 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B4 +Parameter Address = 25 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B4 +Parameter Address = 26 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A4 +Parameter Address = 27 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A4 +Parameter Address = 28 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B5 +Parameter Address = 29 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B5 +Parameter Address = 30 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B5 +Parameter Address = 31 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A5 +Parameter Address = 32 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A5 +Parameter Address = 33 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B6 +Parameter Address = 34 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B6 +Parameter Address = 35 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B6 +Parameter Address = 36 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A6 +Parameter Address = 37 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A6 +Parameter Address = 38 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B1 +Parameter Address = 9 +Parameter Value = 0.99815046787262 +Parameter Data : +0x00 , 0x7F , 0xC3 , 0x65 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B1 +Parameter Address = 10 +Parameter Value = -1.99630105495453 +Parameter Data : +0x0F , 0x00 , 0x79 , 0x35 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B1 +Parameter Address = 11 +Parameter Value = 0.99815046787262 +Parameter Data : +0x00 , 0x7F , 0xC3 , 0x65 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A1 +Parameter Address = 12 +Parameter Value = 1.99629759788513 +Parameter Data : +0x00 , 0xFF , 0x86 , 0xAE , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A1 +Parameter Address = 13 +Parameter Value = -0.996304392814636 +Parameter Data : +0x0F , 0x80 , 0x79 , 0x19 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B2 +Parameter Address = 14 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B2 +Parameter Address = 15 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B2 +Parameter Address = 16 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A2 +Parameter Address = 17 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A2 +Parameter Address = 18 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B3 +Parameter Address = 19 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B3 +Parameter Address = 20 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B3 +Parameter Address = 21 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A3 +Parameter Address = 22 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A3 +Parameter Address = 23 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B4 +Parameter Address = 24 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B4 +Parameter Address = 25 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B4 +Parameter Address = 26 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A4 +Parameter Address = 27 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A4 +Parameter Address = 28 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B5 +Parameter Address = 29 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B5 +Parameter Address = 30 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B5 +Parameter Address = 31 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A5 +Parameter Address = 32 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A5 +Parameter Address = 33 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan10B6 +Parameter Address = 34 +Parameter Value = 1 +Parameter Data : +0x00 , 0x80 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11B6 +Parameter Address = 35 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12B6 +Parameter Address = 36 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan11A6 +Parameter Address = 37 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Param EQ1 +Parameter Name = PEQ1Chan12A6 +Parameter Address = 38 +Parameter Value = 0 +Parameter Data : +0x00 , 0x00 , 0x00 , 0x00 , + + + +Cell Name = Multiple 1 +Parameter Name = Gain1940AlgNS5 +Parameter Address = 39 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + +Cell Name = Multiple 1 +Parameter Name = Gain1940AlgNS6 +Parameter Address = 40 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1slope_1 +Parameter Address = 41 +Parameter Value = -0.014285683631897 +Parameter Data : +0x0F, 0xFE, 0x2B, 0xE3, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1inter_1 +Parameter Address = 42 +Parameter Value = 0.27142858505249 +Parameter Data : +0x00, 0x22, 0xBE, 0x2C, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1slope_2 +Parameter Address = 43 +Parameter Value = -0.166666626930237 +Parameter Data : +0x0F, 0xEA, 0xAA, 0xAB, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1inter_2 +Parameter Address = 44 +Parameter Value = 0.833333373069763 +Parameter Data : +0x00, 0x6A, 0xAA, 0xAB, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1slope_3 +Parameter Address = 45 +Parameter Value = -0.79365074634552 +Parameter Data : +0x0F, 0x9A, 0x69, 0xA7, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1inter_3 +Parameter Address = 46 +Parameter Value = 1.98412692546844 +Parameter Data : +0x00, 0xFD, 0xF7, 0xDF, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1slope_4 +Parameter Address = 47 +Parameter Value = -15.5279502868652 +Parameter Data : +0x08, 0x3C, 0x6C, 0x20, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1inter_4 +Parameter Address = 48 +Parameter Value = 7.91925466060638 +Parameter Data : +0x03, 0xF5, 0xAA, 0x23, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1comp1 +Parameter Address = 49 +Parameter Value = 3 +Parameter Data : +0x01, 0x80, 0x00, 0x00, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1comp2 +Parameter Address = 50 +Parameter Value = 2 +Parameter Data : +0x01, 0x00, 0x00, 0x00, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1comp3 +Parameter Address = 51 +Parameter Value = 0.399999976158142 +Parameter Data : +0x00, 0x33, 0x33, 0x33, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1RMS_MONO_TCONST +Parameter Address = 53 +Parameter Value = 0.000239849090576172 +Parameter Data : +0x00, 0x00, 0x07, 0xDC, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1threshold +Parameter Address = 52 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1decay +Parameter Address = 54 +Parameter Value = 0.000244140625 +Parameter Data : +0x00, 0x00, 0x08, 0x00, + + + +Cell Name = Limiter 1 +Parameter Name = limiterAlg1decaycomplement +Parameter Address = 55 +Parameter Value = 0.99951171875 +Parameter Data : +0x00, 0x7F, 0xF0, 0x00, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2slope_1 +Parameter Address = 56 +Parameter Value = -0.014285683631897 +Parameter Data : +0x0F, 0xFE, 0x2B, 0xE3, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2inter_1 +Parameter Address = 57 +Parameter Value = 0.27142858505249 +Parameter Data : +0x00, 0x22, 0xBE, 0x2C, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2slope_2 +Parameter Address = 58 +Parameter Value = -0.166666626930237 +Parameter Data : +0x0F, 0xEA, 0xAA, 0xAB, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2inter_2 +Parameter Address = 59 +Parameter Value = 0.833333373069763 +Parameter Data : +0x00, 0x6A, 0xAA, 0xAB, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2slope_3 +Parameter Address = 60 +Parameter Value = -0.79365074634552 +Parameter Data : +0x0F, 0x9A, 0x69, 0xA7, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2inter_3 +Parameter Address = 61 +Parameter Value = 1.98412692546844 +Parameter Data : +0x00, 0xFD, 0xF7, 0xDF, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2slope_4 +Parameter Address = 62 +Parameter Value = -15.5279502868652 +Parameter Data : +0x08, 0x3C, 0x6C, 0x20, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2inter_4 +Parameter Address = 63 +Parameter Value = 7.91925466060638 +Parameter Data : +0x03, 0xF5, 0xAA, 0x23, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2comp1 +Parameter Address = 64 +Parameter Value = 3 +Parameter Data : +0x01, 0x80, 0x00, 0x00, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2comp2 +Parameter Address = 65 +Parameter Value = 2 +Parameter Data : +0x01, 0x00, 0x00, 0x00, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2comp3 +Parameter Address = 66 +Parameter Value = 0.399999976158142 +Parameter Data : +0x00, 0x33, 0x33, 0x33, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2RMS_MONO_TCONST +Parameter Address = 68 +Parameter Value = 0.000239849090576172 +Parameter Data : +0x00, 0x00, 0x07, 0xDC, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2threshold +Parameter Address = 67 +Parameter Value = 1 +Parameter Data : +0x00, 0x80, 0x00, 0x00, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2decay +Parameter Address = 69 +Parameter Value = 0.000244140625 +Parameter Data : +0x00, 0x00, 0x08, 0x00, + + + +Cell Name = Limiter 2 +Parameter Name = limiterAlg2decaycomplement +Parameter Address = 70 +Parameter Value = 0.99951171875 +Parameter Data : +0x00, 0x7F, 0xF0, 0x00, + + + +Cell Name = Beep1 +Parameter Name = beep_freqBeepAlg1 +Parameter Address = 2 +Parameter Value = 0.00331640243530273 +Parameter Data : +0x00, 0x00, 0x6C, 0xAC, + + + +Cell Name = Beep1 +Parameter Name = enableBeepAlg1 +Parameter Address = 0 +Parameter Value = 0 +Parameter Data : +0x00, 0x00, 0x00, 0x00, + + + +Cell Name = Beep1 +Parameter Name = kickBeepAlg1 +Parameter Address = 1 +Parameter Value = 0 +Parameter Data : +0x00, 0x00, 0x00, 0x00, + + + +Parameter data for: IC 1 (Hexadecimal format starting at parameter address 0) +See also DigiRadio.hex file +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x6C , 0xAC , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x7F , 0xC3 , 0x65 , +0x0F , 0x00 , 0x79 , 0x35 , +0x00 , 0x7F , 0xC3 , 0x65 , +0x00 , 0xFF , 0x86 , 0xAE , +0x0F , 0x80 , 0x79 , 0x19 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x80 , 0x00 , 0x00 , +0x0F , 0xFE , 0x2B , 0xE3 , +0x00 , 0x22 , 0xBE , 0x2C , +0x0F , 0xEA , 0xAA , 0xAB , +0x00 , 0x6A , 0xAA , 0xAB , +0x0F , 0x9A , 0x69 , 0xA7 , +0x00 , 0xFD , 0xF7 , 0xDF , +0x08 , 0x3C , 0x6C , 0x20 , +0x03 , 0xF5 , 0xAA , 0x23 , +0x01 , 0x80 , 0x00 , 0x00 , +0x01 , 0x00 , 0x00 , 0x00 , +0x00 , 0x33 , 0x33 , 0x33 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x07 , 0xDC , +0x00 , 0x00 , 0x08 , 0x00 , +0x00 , 0x7F , 0xF0 , 0x00 , +0x0F , 0xFE , 0x2B , 0xE3 , +0x00 , 0x22 , 0xBE , 0x2C , +0x0F , 0xEA , 0xAA , 0xAB , +0x00 , 0x6A , 0xAA , 0xAB , +0x0F , 0x9A , 0x69 , 0xA7 , +0x00 , 0xFD , 0xF7 , 0xDF , +0x08 , 0x3C , 0x6C , 0x20 , +0x03 , 0xF5 , 0xAA , 0x23 , +0x01 , 0x80 , 0x00 , 0x00 , +0x01 , 0x00 , 0x00 , 0x00 , +0x00 , 0x33 , 0x33 , 0x33 , +0x00 , 0x80 , 0x00 , 0x00 , +0x00 , 0x00 , 0x07 , 0xDC , +0x00 , 0x00 , 0x08 , 0x00 , +0x00 , 0x7F , 0xF0 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , +0x00 , 0x00 , 0x00 , 0x00 , + +Parameter data for: IC 1 (Binary format starting at parameter address 0) +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 01101100 10101100 +00000000 10000000 00000000 00000000 +00000000 10000000 00000000 00000000 +00000000 10000000 00000000 00000000 +00000000 10000000 00000000 00000000 +00000000 10000000 00000000 00000000 +00000000 10000000 00000000 00000000 +00000000 01111111 11000011 01100101 +00001111 00000000 01111001 00110101 +00000000 01111111 11000011 01100101 +00000000 11111111 10000110 10101110 +00001111 10000000 01111001 00011001 +00000000 10000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 10000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 10000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 10000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 10000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 10000000 00000000 00000000 +00000000 10000000 00000000 00000000 +00001111 11111110 00101011 11100011 +00000000 00100010 10111110 00101100 +00001111 11101010 10101010 10101011 +00000000 01101010 10101010 10101011 +00001111 10011010 01101001 10100111 +00000000 11111101 11110111 11011111 +00001000 00111100 01101100 00100000 +00000011 11110101 10101010 00100011 +00000001 10000000 00000000 00000000 +00000001 00000000 00000000 00000000 +00000000 00110011 00110011 00110011 +00000000 10000000 00000000 00000000 +00000000 00000000 00000111 11011100 +00000000 00000000 00001000 00000000 +00000000 01111111 11110000 00000000 +00001111 11111110 00101011 11100011 +00000000 00100010 10111110 00101100 +00001111 11101010 10101010 10101011 +00000000 01101010 10101010 10101011 +00001111 10011010 01101001 10100111 +00000000 11111101 11110111 11011111 +00001000 00111100 01101100 00100000 +00000011 11110101 10101010 00100011 +00000001 10000000 00000000 00000000 +00000001 00000000 00000000 00000000 +00000000 00110011 00110011 00110011 +00000000 10000000 00000000 00000000 +00000000 00000000 00000111 11011100 +00000000 00000000 00001000 00000000 +00000000 01111111 11110000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 +00000000 00000000 00000000 00000000 + diff --git a/Software/Sigmastudio/DigiRadioTest/DigiRadio.xml b/Software/Sigmastudio/DigiRadioTest/DigiRadio.xml new file mode 100644 index 0000000..b61fd27 --- /dev/null +++ b/Software/Sigmastudio/DigiRadioTest/DigiRadio.xml @@ -0,0 +1,944 @@ + + + + + + IC 1 + Sigma100 + + IC 1.CoreRegister +

2076
+ 0 + 2 + 0x00, 0x18, +
+ + Program Data +
1024
+ 5 + 5120 + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xE8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0xE8, 0x01, 0x00, 0x02, 0x01, 0xA0, 0x01, 0xFF, 0xE1, 0x07, 0x20, 0x01, 0x00, 0x38, 0x00, 0xE2, 0x01, 0x00, 0x42, 0x02, 0x20, 0x01, 0x00, 0x52, 0x00, 0x22, 0x01, 0x00, 0x58, 0x00, 0xE2, 0x01, 0x00, 0x42, 0x00, 0x20, 0x01, 0x00, 0x59, 0x08, 0x22, 0x41, 0x00, 0x39, 0x08, 0x22, 0x01, 0x00, 0x31, 0x08, 0x22, 0x41, 0x00, 0x48, 0x00, 0xE2, 0x01, 0x00, 0x12, 0x03, 0x20, 0x01, 0x00, 0x60, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1A, 0x04, 0x20, 0x01, 0x00, 0x68, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x05, 0x20, 0x01, 0x00, 0x70, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0x06, 0x20, 0x01, 0x00, 0x78, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x59, 0x08, 0x20, 0x01, 0xFF, 0x28, 0x00, 0x02, 0x01, 0x00, 0x62, 0x07, 0x20, 0x01, 0x00, 0x6A, 0x07, 0x40, 0x01, 0x00, 0x72, 0x08, 0x22, 0x01, 0x00, 0x7A, 0x08, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x00, 0xE2, 0x01, 0x01, 0xC8, 0x00, 0xE4, 0x01, 0x00, 0xBA, 0x0C, 0x20, 0x01, 0x00, 0xB2, 0x0D, 0x22, 0x01, 0x00, 0xA2, 0x0C, 0x34, 0x01, 0x00, 0x9A, 0x0D, 0x22, 0x01, 0x00, 0x92, 0x09, 0x22, 0x01, 0x00, 0x8A, 0x0A, 0x22, 0x01, 0x00, 0x82, 0x0B, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA8, 0x00, 0xE2, 0x01, 0x00, 0xC0, 0x00, 0xF2, 0x01, 0x00, 0xEA, 0x11, 0x20, 0x01, 0x00, 0xE2, 0x12, 0x22, 0x01, 0x00, 0xD2, 0x11, 0x34, 0x01, 0x00, 0xCA, 0x12, 0x22, 0x01, 0x00, 0xAA, 0x0E, 0x22, 0x01, 0x00, 0xA2, 0x0F, 0x22, 0x01, 0x00, 0x9A, 0x10, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xD8, 0x00, 0xE2, 0x01, 0x00, 0xF0, 0x00, 0xF2, 0x01, 0x01, 0x1A, 0x16, 0x20, 0x01, 0x01, 0x12, 0x17, 0x22, 0x01, 0x01, 0x02, 0x16, 0x34, 0x01, 0x00, 0xFA, 0x17, 0x22, 0x01, 0x00, 0xDA, 0x13, 0x22, 0x01, 0x00, 0xD2, 0x14, 0x22, 0x01, 0x00, 0xCA, 0x15, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x08, 0x00, 0xE2, 0x01, 0x01, 0x20, 0x00, 0xF2, 0x01, 0x01, 0x4A, 0x1B, 0x20, 0x01, 0x01, 0x42, 0x1C, 0x22, 0x01, 0x01, 0x32, 0x1B, 0x34, 0x01, 0x01, 0x2A, 0x1C, 0x22, 0x01, 0x01, 0x0A, 0x18, 0x22, 0x01, 0x01, 0x02, 0x19, 0x22, 0x01, 0x00, 0xFA, 0x1A, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x38, 0x00, 0xE2, 0x01, 0x01, 0x50, 0x00, 0xF2, 0x01, 0x01, 0x7A, 0x20, 0x20, 0x01, 0x01, 0x72, 0x21, 0x22, 0x01, 0x01, 0x62, 0x20, 0x34, 0x01, 0x01, 0x5A, 0x21, 0x22, 0x01, 0x01, 0x3A, 0x1D, 0x22, 0x01, 0x01, 0x32, 0x1E, 0x22, 0x01, 0x01, 0x2A, 0x1F, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, 0x00, 0xE2, 0x01, 0x01, 0x80, 0x00, 0xF2, 0x01, 0x01, 0xAA, 0x25, 0x20, 0x01, 0x01, 0xA2, 0x26, 0x22, 0x01, 0x01, 0x92, 0x25, 0x34, 0x01, 0x01, 0x8A, 0x26, 0x22, 0x01, 0x01, 0x6A, 0x22, 0x22, 0x01, 0x01, 0x62, 0x23, 0x22, 0x01, 0x01, 0x5A, 0x24, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x98, 0x00, 0xE2, 0x01, 0x01, 0xB0, 0x00, 0xF2, 0x01, 0x01, 0xF2, 0x0C, 0x20, 0x01, 0x01, 0xEA, 0x0D, 0x22, 0x01, 0x01, 0xDA, 0x0C, 0x34, 0x01, 0x01, 0xD2, 0x0D, 0x22, 0x01, 0x01, 0xCA, 0x09, 0x22, 0x01, 0x01, 0xC2, 0x0A, 0x22, 0x01, 0x01, 0xBA, 0x0B, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xE0, 0x00, 0xE2, 0x01, 0x01, 0xF8, 0x00, 0xF2, 0x01, 0x02, 0x22, 0x11, 0x20, 0x01, 0x02, 0x1A, 0x12, 0x22, 0x01, 0x02, 0x0A, 0x11, 0x34, 0x01, 0x02, 0x02, 0x12, 0x22, 0x01, 0x01, 0xE2, 0x0E, 0x22, 0x01, 0x01, 0xDA, 0x0F, 0x22, 0x01, 0x01, 0xD2, 0x10, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x10, 0x00, 0xE2, 0x01, 0x02, 0x28, 0x00, 0xF2, 0x01, 0x02, 0x52, 0x16, 0x20, 0x01, 0x02, 0x4A, 0x17, 0x22, 0x01, 0x02, 0x3A, 0x16, 0x34, 0x01, 0x02, 0x32, 0x17, 0x22, 0x01, 0x02, 0x12, 0x13, 0x22, 0x01, 0x02, 0x0A, 0x14, 0x22, 0x01, 0x02, 0x02, 0x15, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x40, 0x00, 0xE2, 0x01, 0x02, 0x58, 0x00, 0xF2, 0x01, 0x02, 0x82, 0x1B, 0x20, 0x01, 0x02, 0x7A, 0x1C, 0x22, 0x01, 0x02, 0x6A, 0x1B, 0x34, 0x01, 0x02, 0x62, 0x1C, 0x22, 0x01, 0x02, 0x42, 0x18, 0x22, 0x01, 0x02, 0x3A, 0x19, 0x22, 0x01, 0x02, 0x32, 0x1A, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x70, 0x00, 0xE2, 0x01, 0x02, 0x88, 0x00, 0xF2, 0x01, 0x02, 0xB2, 0x20, 0x20, 0x01, 0x02, 0xAA, 0x21, 0x22, 0x01, 0x02, 0x9A, 0x20, 0x34, 0x01, 0x02, 0x92, 0x21, 0x22, 0x01, 0x02, 0x72, 0x1D, 0x22, 0x01, 0x02, 0x6A, 0x1E, 0x22, 0x01, 0x02, 0x62, 0x1F, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xA0, 0x00, 0xE2, 0x01, 0x02, 0xB8, 0x00, 0xF2, 0x01, 0x02, 0xE2, 0x25, 0x20, 0x01, 0x02, 0xDA, 0x26, 0x22, 0x01, 0x02, 0xCA, 0x25, 0x34, 0x01, 0x02, 0xC2, 0x26, 0x22, 0x01, 0x02, 0xA2, 0x22, 0x22, 0x01, 0x02, 0x9A, 0x23, 0x22, 0x01, 0x02, 0x92, 0x24, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xD0, 0x00, 0xE2, 0x01, 0x02, 0xE8, 0x00, 0xF2, 0x01, 0x01, 0x9A, 0x27, 0x20, 0x01, 0x02, 0xF0, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xD2, 0x28, 0x20, 0x01, 0x02, 0xF8, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xF1, 0x08, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x58, 0x00, 0xF0, 0x01, 0xFF, 0xE9, 0x08, 0x22, 0x01, 0x03, 0x50, 0x00, 0xF2, 0x01, 0x03, 0x41, 0x08, 0x20, 0x01, 0x03, 0x42, 0x35, 0x22, 0x41, 0x03, 0x52, 0x35, 0x22, 0x01, 0x03, 0x31, 0x08, 0x34, 0x01, 0x03, 0x32, 0x35, 0x22, 0x41, 0x03, 0x5A, 0x35, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x38, 0x00, 0xE2, 0x01, 0x03, 0x48, 0x00, 0xF2, 0x01, 0x03, 0x60, 0x00, 0xE2, 0x01, 0xFF, 0xF2, 0x31, 0x40, 0x01, 0x03, 0x61, 0x08, 0x20, 0x09, 0x03, 0x62, 0x29, 0x20, 0x01, 0xFF, 0xF2, 0x2A, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x62, 0x2B, 0x20, 0x01, 0xFF, 0xF2, 0x2C, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x23, 0xFF, 0xF2, 0x32, 0x40, 0x01, 0x03, 0x61, 0x08, 0x20, 0x09, 0x03, 0x62, 0x2D, 0x20, 0x01, 0xFF, 0xF2, 0x2E, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x23, 0xFF, 0xF2, 0x33, 0x40, 0x01, 0x03, 0x61, 0x08, 0x20, 0x09, 0x03, 0x62, 0x2F, 0x20, 0x01, 0xFF, 0xF2, 0x30, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0xC0, 0x01, 0x03, 0x67, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x07, 0xFF, 0x20, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x00, 0x00, 0xC0, 0x01, 0x03, 0x67, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x07, 0xFF, 0x20, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x00, 0x00, 0xC0, 0x01, 0x03, 0x67, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x07, 0xFF, 0x20, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x34, 0xA0, 0x01, 0xFF, 0xE7, 0xFF, 0x20, 0x01, 0x03, 0x28, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x29, 0x08, 0x40, 0x01, 0xFF, 0xF1, 0x08, 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x28, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x29, 0x08, 0x40, 0x01, 0x03, 0x21, 0x08, 0x20, 0x09, 0x03, 0x2A, 0x36, 0x20, 0x01, 0x03, 0x22, 0x36, 0x22, 0x41, 0x03, 0x21, 0x08, 0x22, 0x01, 0x03, 0x28, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x29, 0x08, 0x20, 0x01, 0x03, 0x18, 0x00, 0xE2, 0x01, 0xFF, 0xF2, 0x37, 0x22, 0x49, 0xFF, 0xF1, 0x08, 0x20, 0x01, 0xFF, 0xE9, 0x08, 0x20, 0x25, 0x03, 0x10, 0x00, 0xE2, 0x01, 0x03, 0x28, 0x00, 0xC0, 0x01, 0x02, 0xF7, 0xFF, 0x20, 0x01, 0x03, 0x08, 0x00, 0xE2, 0x01, 0x02, 0xF9, 0x08, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x58, 0x00, 0xF0, 0x01, 0xFF, 0xE9, 0x08, 0x22, 0x01, 0x03, 0x50, 0x00, 0xF2, 0x01, 0x03, 0xA1, 0x08, 0x20, 0x01, 0x03, 0xA2, 0x44, 0x22, 0x41, 0x03, 0x52, 0x44, 0x22, 0x01, 0x03, 0x91, 0x08, 0x34, 0x01, 0x03, 0x92, 0x44, 0x22, 0x41, 0x03, 0x5A, 0x44, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x98, 0x00, 0xE2, 0x01, 0x03, 0xA8, 0x00, 0xF2, 0x01, 0x03, 0x60, 0x00, 0xE2, 0x01, 0xFF, 0xF2, 0x40, 0x40, 0x01, 0x03, 0x61, 0x08, 0x20, 0x09, 0x03, 0x62, 0x38, 0x20, 0x01, 0xFF, 0xF2, 0x39, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x62, 0x3A, 0x20, 0x01, 0xFF, 0xF2, 0x3B, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x23, 0xFF, 0xF2, 0x41, 0x40, 0x01, 0x03, 0x61, 0x08, 0x20, 0x09, 0x03, 0x62, 0x3C, 0x20, 0x01, 0xFF, 0xF2, 0x3D, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x23, 0xFF, 0xF2, 0x42, 0x40, 0x01, 0x03, 0x61, 0x08, 0x20, 0x09, 0x03, 0x62, 0x3E, 0x20, 0x01, 0xFF, 0xF2, 0x3F, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0xC0, 0x01, 0x03, 0x67, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x07, 0xFF, 0x20, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x00, 0x00, 0xC0, 0x01, 0x03, 0x67, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x07, 0xFF, 0x20, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x00, 0x00, 0xC0, 0x01, 0x03, 0x67, 0xFF, 0x20, 0x41, 0xFF, 0xF1, 0x07, 0x22, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x07, 0xFF, 0x20, 0x01, 0x03, 0x00, 0x00, 0xE2, 0x01, 0x03, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x43, 0xA0, 0x01, 0xFF, 0xE7, 0xFF, 0x20, 0x01, 0x03, 0x88, 0x00, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x89, 0x08, 0x40, 0x01, 0xFF, 0xF1, 0x08, 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x88, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x89, 0x08, 0x40, 0x01, 0x03, 0x81, 0x08, 0x20, 0x09, 0x03, 0x8A, 0x45, 0x20, 0x01, 0x03, 0x82, 0x45, 0x22, 0x41, 0x03, 0x81, 0x08, 0x22, 0x01, 0x03, 0x88, 0x00, 0xE2, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x89, 0x08, 0x20, 0x01, 0x03, 0x78, 0x00, 0xE2, 0x01, 0xFF, 0xF2, 0x46, 0x22, 0x49, 0xFF, 0xF1, 0x08, 0x20, 0x01, 0xFF, 0xE9, 0x08, 0x20, 0x25, 0x03, 0x70, 0x00, 0xE2, 0x01, 0x03, 0x88, 0x00, 0xC0, 0x01, 0x02, 0xFF, 0xFF, 0x20, 0x01, 0x03, 0x68, 0x00, 0xE2, 0x01, 0x03, 0x69, 0x08, 0x20, 0x01, 0xFF, 0x30, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, +
+ + Param +
0
+ 4 + 4096 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xAC, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xC3, 0x65, 0x0F, 0x00, 0x79, 0x35, 0x00, 0x7F, 0xC3, 0x65, 0x00, 0xFF, 0x86, 0xAE, 0x0F, 0x80, 0x79, 0x19, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0F, 0xFE, 0x2B, 0xE3, 0x00, 0x22, 0xBE, 0x2C, 0x0F, 0xEA, 0xAA, 0xAB, 0x00, 0x6A, 0xAA, 0xAB, 0x0F, 0x9A, 0x69, 0xA7, 0x00, 0xFD, 0xF7, 0xDF, 0x08, 0x3C, 0x6C, 0x20, 0x03, 0xF5, 0xAA, 0x23, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x0F, 0xFE, 0x2B, 0xE3, 0x00, 0x22, 0xBE, 0x2C, 0x0F, 0xEA, 0xAA, 0xAB, 0x00, 0x6A, 0xAA, 0xAB, 0x0F, 0x9A, 0x69, 0xA7, 0x00, 0xFD, 0xF7, 0xDF, 0x08, 0x3C, 0x6C, 0x20, 0x03, 0xF5, 0xAA, 0x23, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +
+ + IC 1.HWConFiguration +
2076
+ 0 + 24 + 0x00, 0x18, 0x08, 0x08, 0x00, 0x00, 0x44, 0x00, 0x44, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +
+ + IC 1.CoreRegister +
2076
+ 0 + 2 + 0x00, 0x1C, +
+ + Si4674 + + ALG0 + Gain1940AlgNS1 + Gain (no slew)( 1 ) : Gain`max[ 0 ],Gain`min[ -80 ],Gain`res[ 40 ],Gain[ 0 ]; + + Gain1940AlgNS1 + FixedPoint +
3
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+
+ + ALG1 + Gain1940AlgNS2 + Gain (no slew)( 1 ) : Gain`max[ 0 ],Gain`min[ -80 ],Gain`res[ 40 ],Gain[ 0 ]; + + Gain1940AlgNS2 + FixedPoint +
4
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+
+
+ + ESP32 + + ALG0 + Gain1940AlgNS3 + Gain (no slew)( 1 ) : Gain`max[ 0 ],Gain`min[ -80 ],Gain`res[ 40 ],Gain[ 0 ]; + + Gain1940AlgNS3 + FixedPoint +
5
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+
+ + ALG1 + Gain1940AlgNS4 + Gain (no slew)( 1 ) : Gain`max[ 0 ],Gain`min[ -80 ],Gain`res[ 40 ],Gain[ 0 ]; + + Gain1940AlgNS4 + FixedPoint +
6
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+
+
+ + St Mixer1 + + ALG0 + StereoMixerAlg1 + Stereo Mixer( 2 ) : Gain`max[ 6 ],Gain`min[ -30 ],Gain`res[ 36 ],Gain[ 0 ];Gain`max[ 6 ],Gain`min[ -30 ],Gain`res[ 36 ],Gain[ 0 ]; + + StereoMixerAlg12 + FixedPoint +
7
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + StereoMixerAlg14 + FixedPoint +
8
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+
+
+ + Param EQ1 + + ALG0 + PEQ1Chan1 + PEQ1Chan - Double Precision( 1 ) : Gain10[ 0 ],Gain20[ 0 ],Q0[ 1.41 ],Boost0[ 0 ],Frequency10[ 20 ],Frequency20[ 1000 ],Ripple0[ 0.1 ],Active10[ True ],Active20[ True ],LowPass10[ True ],LowPass20[ True ],Bypass0[ False ],View0[ False ],Type0[ 6 ],SubType0[ 0 ],Gain11[ 0 ],Gain21[ 0 ],Q1[ 1 ],Boost1[ 0 ],Frequency11[ 100 ],Frequency21[ 1000 ],Ripple1[ 0.1 ],Active11[ True ],Active21[ True ],LowPass11[ True ],LowPass21[ True ],Bypass1[ False ],View1[ False ],Type1[ 0 ],SubType1[ 0 ],Gain12[ 0 ],Gain22[ 0 ],Q2[ 1 ],Boost2[ 0 ],Frequency12[ 400 ],Frequency22[ 1000 ],Ripple2[ 0.1 ],Active12[ True ],Active22[ True ],LowPass12[ True ],LowPass22[ True ],Bypass2[ False ],View2[ False ],Type2[ 0 ],SubType2[ 0 ],Gain13[ 0 ],Gain23[ 0 ],Q3[ 1 ],Boost3[ 0 ],Frequency13[ 1000 ],Frequency23[ 1000 ],Ripple3[ 0.1 ],Active13[ True ],Active23[ True ],LowPass13[ True ],LowPass23[ True ],Bypass3[ False ],View3[ False ],Type3[ 0 ],SubType3[ 0 ],Gain14[ 0 ],Gain24[ 0 ],Q4[ 1 ],Boost4[ 0 ],Frequency14[ 3000 ],Frequency24[ 1000 ],Ripple4[ 0.1 ],Active14[ True ],Active24[ True ],LowPass14[ True ],LowPass24[ True ],Bypass4[ False ],View4[ False ],Type4[ 0 ],SubType4[ 0 ],Gain15[ 0 ],Gain25[ 0 ],Q5[ 1 ],Boost5[ 0 ],Frequency15[ 8000 ],Frequency25[ 1000 ],Ripple5[ 0.1 ],Active15[ True ],Active25[ True ],LowPass15[ True ],LowPass25[ True ],Bypass5[ False ],View5[ False ],Type5[ 0 ],SubType5[ 0 ],Gain16[ 0 ],Gain26[ 0 ],Q6[ 1.41 ],Boost6[ 5 ],Frequency16[ 4000 ],Frequency26[ 1000 ],Ripple6[ 0.1 ],Active16[ True ],Active26[ True ],LowPass16[ True ],LowPass26[ True ],Bypass6[ False ],View6[ False ],Type6[ 0 ],SubType6[ 0 ],Gain17[ 0 ],Gain27[ 0 ],Q7[ 1.41 ],Boost7[ 5 ],Frequency17[ 8000 ],Frequency27[ 1000 ],Ripple7[ 0.1 ],Active17[ True ],Active27[ True ],LowPass17[ True ],LowPass27[ True ],Bypass7[ False ],View7[ False ],Type7[ 0 ],SubType7[ 0 ],Gain18[ 0 ],Gain28[ 0 ],Q8[ 1.41 ],Boost8[ 5 ],Frequency18[ 16000 ],Frequency28[ 1000 ],Ripple8[ 0.1 ],Active18[ True ],Active28[ True ],LowPass18[ True ],LowPass28[ True ],Bypass8[ False ],View8[ False ],Type8[ 0 ],SubType8[ 0 ],Gain19[ 0 ],Gain29[ 0 ],Q9[ 1.41 ],Boost9[ 5 ],Frequency19[ 32000 ],Frequency29[ 1000 ],Ripple9[ 0.1 ],Active19[ True ],Active29[ True ],LowPass19[ True ],LowPass29[ True ],Bypass9[ False ],View9[ False ],Type9[ 0 ],SubType9[ 0 ],Gain110[ 0 ],Gain210[ 0 ],Q10[ 1.41 ],Boost10[ 5 ],Frequency110[ 64000 ],Frequency210[ 1000 ],Ripple10[ 0.1 ],Active110[ True ],Active210[ True ],LowPass110[ True ],LowPass210[ True ],Bypass10[ False ],View10[ False ],Type10[ 0 ],SubType10[ 0 ],Gain111[ 0 ],Gain211[ 0 ],Q11[ 1.41 ],Boost11[ 5 ],Frequency111[ 128000 ],Frequency211[ 1000 ],Ripple11[ 0.1 ],Active111[ True ],Active211[ True ],LowPass111[ True ],LowPass211[ True ],Bypass11[ False ],View11[ False ],Type11[ 0 ],SubType11[ 0 ],Gain112[ 0 ],Gain212[ 0 ],Q12[ 1.41 ],Boost12[ 5 ],Frequency112[ 256000 ],Frequency212[ 1000 ],Ripple12[ 0.1 ],Active112[ True ],Active212[ True ],LowPass112[ True ],LowPass212[ True ],Bypass12[ False ],View12[ False ],Type12[ 0 ],SubType12[ 0 ],Gain113[ 0 ],Gain213[ 0 ],Q13[ 1.41 ],Boost13[ 5 ],Frequency113[ 512000 ],Frequency213[ 1000 ],Ripple13[ 0.1 ],Active113[ True ],Active213[ True ],LowPass113[ True ],LowPass213[ True ],Bypass13[ False ],View13[ False ],Type13[ 0 ],SubType13[ 0 ],Gain114[ 0 ],Gain214[ 0 ],Q14[ 1.41 ],Boost14[ 5 ],Frequency114[ 1024000 ],Frequency214[ 1000 ],Ripple14[ 0.1 ],Active114[ True ],Active214[ True ],LowPass114[ True ],LowPass214[ True ],Bypass14[ False ],View14[ False ],Type14[ 0 ],SubType14[ 0 ],Index[ 5 ]; + + PEQ1Chan10B1 + FixedPoint +
9
+ 0.99815046787262 + 4 + 0x00, 0x7F, 0xC3, 0x65, +
+ + PEQ1Chan10B1 + FixedPoint +
9
+ 0.99815046787262 + 4 + 0x00, 0x7F, 0xC3, 0x65, +
+ + PEQ1Chan11B1 + FixedPoint +
10
+ -1.99630105495453 + 4 + 0x0F, 0x00, 0x79, 0x35, +
+ + PEQ1Chan11B1 + FixedPoint +
10
+ -1.99630105495453 + 4 + 0x0F, 0x00, 0x79, 0x35, +
+ + PEQ1Chan12B1 + FixedPoint +
11
+ 0.99815046787262 + 4 + 0x00, 0x7F, 0xC3, 0x65, +
+ + PEQ1Chan12B1 + FixedPoint +
11
+ 0.99815046787262 + 4 + 0x00, 0x7F, 0xC3, 0x65, +
+ + PEQ1Chan11A1 + FixedPoint +
12
+ 1.99629759788513 + 4 + 0x00, 0xFF, 0x86, 0xAE, +
+ + PEQ1Chan11A1 + FixedPoint +
12
+ 1.99629759788513 + 4 + 0x00, 0xFF, 0x86, 0xAE, +
+ + PEQ1Chan12A1 + FixedPoint +
13
+ -0.996304392814636 + 4 + 0x0F, 0x80, 0x79, 0x19, +
+ + PEQ1Chan12A1 + FixedPoint +
13
+ -0.996304392814636 + 4 + 0x0F, 0x80, 0x79, 0x19, +
+ + PEQ1Chan10B2 + FixedPoint +
14
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + PEQ1Chan10B2 + FixedPoint +
14
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + PEQ1Chan11B2 + FixedPoint +
15
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11B2 + FixedPoint +
15
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12B2 + FixedPoint +
16
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12B2 + FixedPoint +
16
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11A2 + FixedPoint +
17
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11A2 + FixedPoint +
17
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12A2 + FixedPoint +
18
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12A2 + FixedPoint +
18
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan10B3 + FixedPoint +
19
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + PEQ1Chan10B3 + FixedPoint +
19
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + PEQ1Chan11B3 + FixedPoint +
20
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11B3 + FixedPoint +
20
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12B3 + FixedPoint +
21
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12B3 + FixedPoint +
21
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11A3 + FixedPoint +
22
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11A3 + FixedPoint +
22
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12A3 + FixedPoint +
23
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12A3 + FixedPoint +
23
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan10B4 + FixedPoint +
24
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + PEQ1Chan10B4 + FixedPoint +
24
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + PEQ1Chan11B4 + FixedPoint +
25
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11B4 + FixedPoint +
25
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12B4 + FixedPoint +
26
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12B4 + FixedPoint +
26
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11A4 + FixedPoint +
27
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11A4 + FixedPoint +
27
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12A4 + FixedPoint +
28
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12A4 + FixedPoint +
28
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan10B5 + FixedPoint +
29
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + PEQ1Chan10B5 + FixedPoint +
29
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + PEQ1Chan11B5 + FixedPoint +
30
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11B5 + FixedPoint +
30
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12B5 + FixedPoint +
31
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12B5 + FixedPoint +
31
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11A5 + FixedPoint +
32
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11A5 + FixedPoint +
32
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12A5 + FixedPoint +
33
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12A5 + FixedPoint +
33
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan10B6 + FixedPoint +
34
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + PEQ1Chan10B6 + FixedPoint +
34
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + PEQ1Chan11B6 + FixedPoint +
35
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11B6 + FixedPoint +
35
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12B6 + FixedPoint +
36
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12B6 + FixedPoint +
36
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11A6 + FixedPoint +
37
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan11A6 + FixedPoint +
37
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12A6 + FixedPoint +
38
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + PEQ1Chan12A6 + FixedPoint +
38
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+
+
+ + Multiple 1 + + ALG0 + Gain1940AlgNS5 + Gain (no slew)( 1 ) : Gain`max[ 0 ],Gain`min[ -80 ],Gain`res[ 40 ],Gain[ 0 ]; + + Gain1940AlgNS5 + FixedPoint +
39
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+
+ + ALG1 + Gain1940AlgNS6 + Gain (no slew)( 1 ) : Gain`max[ 0 ],Gain`min[ -80 ],Gain`res[ 40 ],Gain[ 0 ]; + + Gain1940AlgNS6 + FixedPoint +
40
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+
+
+ + Limiter 1 + + ALG0 + limiterAlg1 + Limiter with Indicator( 1 ) : RMSvalue[ 50 ],Threshold[ 0 ],DecayTime[ 12 ]; + + limiterAlg1slope_1 + FixedPoint +
41
+ -0.014285683631897 + 4 + 0x0F, 0xFE, 0x2B, 0xE3, +
+ + limiterAlg1inter_1 + FixedPoint +
42
+ 0.27142858505249 + 4 + 0x00, 0x22, 0xBE, 0x2C, +
+ + limiterAlg1slope_2 + FixedPoint +
43
+ -0.166666626930237 + 4 + 0x0F, 0xEA, 0xAA, 0xAB, +
+ + limiterAlg1inter_2 + FixedPoint +
44
+ 0.833333373069763 + 4 + 0x00, 0x6A, 0xAA, 0xAB, +
+ + limiterAlg1slope_3 + FixedPoint +
45
+ -0.79365074634552 + 4 + 0x0F, 0x9A, 0x69, 0xA7, +
+ + limiterAlg1inter_3 + FixedPoint +
46
+ 1.98412692546844 + 4 + 0x00, 0xFD, 0xF7, 0xDF, +
+ + limiterAlg1slope_4 + FixedPoint +
47
+ -15.5279502868652 + 4 + 0x08, 0x3C, 0x6C, 0x20, +
+ + limiterAlg1inter_4 + FixedPoint +
48
+ 7.91925466060638 + 4 + 0x03, 0xF5, 0xAA, 0x23, +
+ + limiterAlg1comp1 + FixedPoint +
49
+ 3 + 4 + 0x01, 0x80, 0x00, 0x00, +
+ + limiterAlg1comp2 + FixedPoint +
50
+ 2 + 4 + 0x01, 0x00, 0x00, 0x00, +
+ + limiterAlg1comp3 + FixedPoint +
51
+ 0.399999976158142 + 4 + 0x00, 0x33, 0x33, 0x33, +
+ + limiterAlg1threshold + FixedPoint +
52
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + limiterAlg1RMS_MONO_TCONST + FixedPoint +
53
+ 0.000239849090576172 + 4 + 0x00, 0x00, 0x07, 0xDC, +
+ + limiterAlg1decay + FixedPoint +
54
+ 0.000244140625 + 4 + 0x00, 0x00, 0x08, 0x00, +
+ + limiterAlg1decaycomplement + FixedPoint +
55
+ 0.99951171875 + 4 + 0x00, 0x7F, 0xF0, 0x00, +
+
+
+ + Limiter 2 + + ALG0 + limiterAlg2 + Limiter with Indicator( 1 ) : RMSvalue[ 50 ],Threshold[ 0 ],DecayTime[ 12 ]; + + limiterAlg2slope_1 + FixedPoint +
56
+ -0.014285683631897 + 4 + 0x0F, 0xFE, 0x2B, 0xE3, +
+ + limiterAlg2inter_1 + FixedPoint +
57
+ 0.27142858505249 + 4 + 0x00, 0x22, 0xBE, 0x2C, +
+ + limiterAlg2slope_2 + FixedPoint +
58
+ -0.166666626930237 + 4 + 0x0F, 0xEA, 0xAA, 0xAB, +
+ + limiterAlg2inter_2 + FixedPoint +
59
+ 0.833333373069763 + 4 + 0x00, 0x6A, 0xAA, 0xAB, +
+ + limiterAlg2slope_3 + FixedPoint +
60
+ -0.79365074634552 + 4 + 0x0F, 0x9A, 0x69, 0xA7, +
+ + limiterAlg2inter_3 + FixedPoint +
61
+ 1.98412692546844 + 4 + 0x00, 0xFD, 0xF7, 0xDF, +
+ + limiterAlg2slope_4 + FixedPoint +
62
+ -15.5279502868652 + 4 + 0x08, 0x3C, 0x6C, 0x20, +
+ + limiterAlg2inter_4 + FixedPoint +
63
+ 7.91925466060638 + 4 + 0x03, 0xF5, 0xAA, 0x23, +
+ + limiterAlg2comp1 + FixedPoint +
64
+ 3 + 4 + 0x01, 0x80, 0x00, 0x00, +
+ + limiterAlg2comp2 + FixedPoint +
65
+ 2 + 4 + 0x01, 0x00, 0x00, 0x00, +
+ + limiterAlg2comp3 + FixedPoint +
66
+ 0.399999976158142 + 4 + 0x00, 0x33, 0x33, 0x33, +
+ + limiterAlg2threshold + FixedPoint +
67
+ 1 + 4 + 0x00, 0x80, 0x00, 0x00, +
+ + limiterAlg2RMS_MONO_TCONST + FixedPoint +
68
+ 0.000239849090576172 + 4 + 0x00, 0x00, 0x07, 0xDC, +
+ + limiterAlg2decay + FixedPoint +
69
+ 0.000244140625 + 4 + 0x00, 0x00, 0x08, 0x00, +
+ + limiterAlg2decaycomplement + FixedPoint +
70
+ 0.99951171875 + 4 + 0x00, 0x7F, 0xF0, 0x00, +
+
+
+ + Beep1 + + ALG0 + BeepAlg1 + Beep - variable gain( 1 ) : Frequency[ 440 ]; + + enableBeepAlg1 + FixedPoint +
0
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + kickBeepAlg1 + FixedPoint +
1
+ 0 + 4 + 0x00, 0x00, 0x00, 0x00, +
+ + beep_freqBeepAlg1 + FixedPoint +
2
+ 0.00331640243530273 + 4 + 0x00, 0x00, 0x6C, 0xAC, +
+
+
+ + \ No newline at end of file diff --git a/Software/Sigmastudio/DigiRadioTest/DigiRadio_IC_1.h b/Software/Sigmastudio/DigiRadioTest/DigiRadio_IC_1.h new file mode 100644 index 0000000..94b9c23 --- /dev/null +++ b/Software/Sigmastudio/DigiRadioTest/DigiRadio_IC_1.h @@ -0,0 +1,2119 @@ +/* + * File: C:\Users\mikbi\Documents\Allegati\Desktop\DigiRadioTest\DigiRadio_IC_1.h + * + * Created: Thursday, August 6, 2026 1:57:25 PM + * Description: DigiRadio:IC 1 program data. + * + * This software is distributed in the hope that it will be useful, + * but is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * This software may only be used to program products purchased from + * Analog Devices for incorporation by you into audio products that + * are intended for resale to audio product end users. This software + * may not be distributed whole or in any part to third parties. + * + * Copyright ©2026 Analog Devices, Inc. All rights reserved. + */ +#ifndef __DIGIRADIO_IC_1_H__ +#define __DIGIRADIO_IC_1_H__ + +#include "SigmaStudioFW.h" +#include "DigiRadio_IC_1_REG.h" + +#define DEVICE_ARCHITECTURE_IC_1 "ADAU1701" +#define DEVICE_ADDR_IC_1 0x68 + +/* DSP Program Data */ +#define PROGRAM_SIZE_IC_1 5120 +#define PROGRAM_ADDR_IC_1 1024 +ADI_REG_TYPE Program_Data_IC_1[PROGRAM_SIZE_IC_1] = { +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0xE8, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x08, 0x00, 0xE8, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x10, 0x00, 0xE8, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x18, 0x00, 0xE8, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x20, 0x00, 0xE8, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x28, 0x00, 0xE8, 0x01, +0x00, 0x02, 0x01, 0xA0, 0x01, +0xFF, 0xE1, 0x07, 0x20, 0x01, +0x00, 0x38, 0x00, 0xE2, 0x01, +0x00, 0x42, 0x02, 0x20, 0x01, +0x00, 0x52, 0x00, 0x22, 0x01, +0x00, 0x58, 0x00, 0xE2, 0x01, +0x00, 0x42, 0x00, 0x20, 0x01, +0x00, 0x59, 0x08, 0x22, 0x41, +0x00, 0x39, 0x08, 0x22, 0x01, +0x00, 0x31, 0x08, 0x22, 0x41, +0x00, 0x48, 0x00, 0xE2, 0x01, +0x00, 0x12, 0x03, 0x20, 0x01, +0x00, 0x60, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x1A, 0x04, 0x20, 0x01, +0x00, 0x68, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x22, 0x05, 0x20, 0x01, +0x00, 0x70, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x2A, 0x06, 0x20, 0x01, +0x00, 0x78, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x59, 0x08, 0x20, 0x01, +0xFF, 0x28, 0x00, 0x02, 0x01, +0x00, 0x62, 0x07, 0x20, 0x01, +0x00, 0x6A, 0x07, 0x40, 0x01, +0x00, 0x72, 0x08, 0x22, 0x01, +0x00, 0x7A, 0x08, 0x44, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x90, 0x00, 0xE2, 0x01, +0x01, 0xC8, 0x00, 0xE4, 0x01, +0x00, 0xBA, 0x0C, 0x20, 0x01, +0x00, 0xB2, 0x0D, 0x22, 0x01, +0x00, 0xA2, 0x0C, 0x34, 0x01, +0x00, 0x9A, 0x0D, 0x22, 0x01, +0x00, 0x92, 0x09, 0x22, 0x01, +0x00, 0x8A, 0x0A, 0x22, 0x01, +0x00, 0x82, 0x0B, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0xA8, 0x00, 0xE2, 0x01, +0x00, 0xC0, 0x00, 0xF2, 0x01, +0x00, 0xEA, 0x11, 0x20, 0x01, +0x00, 0xE2, 0x12, 0x22, 0x01, +0x00, 0xD2, 0x11, 0x34, 0x01, +0x00, 0xCA, 0x12, 0x22, 0x01, +0x00, 0xAA, 0x0E, 0x22, 0x01, +0x00, 0xA2, 0x0F, 0x22, 0x01, +0x00, 0x9A, 0x10, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0xD8, 0x00, 0xE2, 0x01, +0x00, 0xF0, 0x00, 0xF2, 0x01, +0x01, 0x1A, 0x16, 0x20, 0x01, +0x01, 0x12, 0x17, 0x22, 0x01, +0x01, 0x02, 0x16, 0x34, 0x01, +0x00, 0xFA, 0x17, 0x22, 0x01, +0x00, 0xDA, 0x13, 0x22, 0x01, +0x00, 0xD2, 0x14, 0x22, 0x01, +0x00, 0xCA, 0x15, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x08, 0x00, 0xE2, 0x01, +0x01, 0x20, 0x00, 0xF2, 0x01, +0x01, 0x4A, 0x1B, 0x20, 0x01, +0x01, 0x42, 0x1C, 0x22, 0x01, +0x01, 0x32, 0x1B, 0x34, 0x01, +0x01, 0x2A, 0x1C, 0x22, 0x01, +0x01, 0x0A, 0x18, 0x22, 0x01, +0x01, 0x02, 0x19, 0x22, 0x01, +0x00, 0xFA, 0x1A, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x38, 0x00, 0xE2, 0x01, +0x01, 0x50, 0x00, 0xF2, 0x01, +0x01, 0x7A, 0x20, 0x20, 0x01, +0x01, 0x72, 0x21, 0x22, 0x01, +0x01, 0x62, 0x20, 0x34, 0x01, +0x01, 0x5A, 0x21, 0x22, 0x01, +0x01, 0x3A, 0x1D, 0x22, 0x01, +0x01, 0x32, 0x1E, 0x22, 0x01, +0x01, 0x2A, 0x1F, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x68, 0x00, 0xE2, 0x01, +0x01, 0x80, 0x00, 0xF2, 0x01, +0x01, 0xAA, 0x25, 0x20, 0x01, +0x01, 0xA2, 0x26, 0x22, 0x01, +0x01, 0x92, 0x25, 0x34, 0x01, +0x01, 0x8A, 0x26, 0x22, 0x01, +0x01, 0x6A, 0x22, 0x22, 0x01, +0x01, 0x62, 0x23, 0x22, 0x01, +0x01, 0x5A, 0x24, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x98, 0x00, 0xE2, 0x01, +0x01, 0xB0, 0x00, 0xF2, 0x01, +0x01, 0xF2, 0x0C, 0x20, 0x01, +0x01, 0xEA, 0x0D, 0x22, 0x01, +0x01, 0xDA, 0x0C, 0x34, 0x01, +0x01, 0xD2, 0x0D, 0x22, 0x01, +0x01, 0xCA, 0x09, 0x22, 0x01, +0x01, 0xC2, 0x0A, 0x22, 0x01, +0x01, 0xBA, 0x0B, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0xE0, 0x00, 0xE2, 0x01, +0x01, 0xF8, 0x00, 0xF2, 0x01, +0x02, 0x22, 0x11, 0x20, 0x01, +0x02, 0x1A, 0x12, 0x22, 0x01, +0x02, 0x0A, 0x11, 0x34, 0x01, +0x02, 0x02, 0x12, 0x22, 0x01, +0x01, 0xE2, 0x0E, 0x22, 0x01, +0x01, 0xDA, 0x0F, 0x22, 0x01, +0x01, 0xD2, 0x10, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0x10, 0x00, 0xE2, 0x01, +0x02, 0x28, 0x00, 0xF2, 0x01, +0x02, 0x52, 0x16, 0x20, 0x01, +0x02, 0x4A, 0x17, 0x22, 0x01, +0x02, 0x3A, 0x16, 0x34, 0x01, +0x02, 0x32, 0x17, 0x22, 0x01, +0x02, 0x12, 0x13, 0x22, 0x01, +0x02, 0x0A, 0x14, 0x22, 0x01, +0x02, 0x02, 0x15, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0x40, 0x00, 0xE2, 0x01, +0x02, 0x58, 0x00, 0xF2, 0x01, +0x02, 0x82, 0x1B, 0x20, 0x01, +0x02, 0x7A, 0x1C, 0x22, 0x01, +0x02, 0x6A, 0x1B, 0x34, 0x01, +0x02, 0x62, 0x1C, 0x22, 0x01, +0x02, 0x42, 0x18, 0x22, 0x01, +0x02, 0x3A, 0x19, 0x22, 0x01, +0x02, 0x32, 0x1A, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0x70, 0x00, 0xE2, 0x01, +0x02, 0x88, 0x00, 0xF2, 0x01, +0x02, 0xB2, 0x20, 0x20, 0x01, +0x02, 0xAA, 0x21, 0x22, 0x01, +0x02, 0x9A, 0x20, 0x34, 0x01, +0x02, 0x92, 0x21, 0x22, 0x01, +0x02, 0x72, 0x1D, 0x22, 0x01, +0x02, 0x6A, 0x1E, 0x22, 0x01, +0x02, 0x62, 0x1F, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0xA0, 0x00, 0xE2, 0x01, +0x02, 0xB8, 0x00, 0xF2, 0x01, +0x02, 0xE2, 0x25, 0x20, 0x01, +0x02, 0xDA, 0x26, 0x22, 0x01, +0x02, 0xCA, 0x25, 0x34, 0x01, +0x02, 0xC2, 0x26, 0x22, 0x01, +0x02, 0xA2, 0x22, 0x22, 0x01, +0x02, 0x9A, 0x23, 0x22, 0x01, +0x02, 0x92, 0x24, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0xD0, 0x00, 0xE2, 0x01, +0x02, 0xE8, 0x00, 0xF2, 0x01, +0x01, 0x9A, 0x27, 0x20, 0x01, +0x02, 0xF0, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0xD2, 0x28, 0x20, 0x01, +0x02, 0xF8, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0xF1, 0x08, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x58, 0x00, 0xF0, 0x01, +0xFF, 0xE9, 0x08, 0x22, 0x01, +0x03, 0x50, 0x00, 0xF2, 0x01, +0x03, 0x41, 0x08, 0x20, 0x01, +0x03, 0x42, 0x35, 0x22, 0x41, +0x03, 0x52, 0x35, 0x22, 0x01, +0x03, 0x31, 0x08, 0x34, 0x01, +0x03, 0x32, 0x35, 0x22, 0x41, +0x03, 0x5A, 0x35, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x38, 0x00, 0xE2, 0x01, +0x03, 0x48, 0x00, 0xF2, 0x01, +0x03, 0x60, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x31, 0x40, 0x01, +0x03, 0x61, 0x08, 0x20, 0x09, +0x03, 0x62, 0x29, 0x20, 0x01, +0xFF, 0xF2, 0x2A, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x62, 0x2B, 0x20, 0x01, +0xFF, 0xF2, 0x2C, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x32, 0x40, 0x01, +0x03, 0x61, 0x08, 0x20, 0x09, +0x03, 0x62, 0x2D, 0x20, 0x01, +0xFF, 0xF2, 0x2E, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x33, 0x40, 0x01, +0x03, 0x61, 0x08, 0x20, 0x09, +0x03, 0x62, 0x2F, 0x20, 0x01, +0xFF, 0xF2, 0x30, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x03, 0x67, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x07, 0xFF, 0x20, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x03, 0x67, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x07, 0xFF, 0x20, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x03, 0x67, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x07, 0xFF, 0x20, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x00, 0x02, 0x34, 0xA0, 0x01, +0xFF, 0xE7, 0xFF, 0x20, 0x01, +0x03, 0x28, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x29, 0x08, 0x40, 0x01, +0xFF, 0xF1, 0x08, 0x20, 0x09, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x28, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x29, 0x08, 0x40, 0x01, +0x03, 0x21, 0x08, 0x20, 0x09, +0x03, 0x2A, 0x36, 0x20, 0x01, +0x03, 0x22, 0x36, 0x22, 0x41, +0x03, 0x21, 0x08, 0x22, 0x01, +0x03, 0x28, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x29, 0x08, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x37, 0x22, 0x49, +0xFF, 0xF1, 0x08, 0x20, 0x01, +0xFF, 0xE9, 0x08, 0x20, 0x25, +0x03, 0x10, 0x00, 0xE2, 0x01, +0x03, 0x28, 0x00, 0xC0, 0x01, +0x02, 0xF7, 0xFF, 0x20, 0x01, +0x03, 0x08, 0x00, 0xE2, 0x01, +0x02, 0xF9, 0x08, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x58, 0x00, 0xF0, 0x01, +0xFF, 0xE9, 0x08, 0x22, 0x01, +0x03, 0x50, 0x00, 0xF2, 0x01, +0x03, 0xA1, 0x08, 0x20, 0x01, +0x03, 0xA2, 0x44, 0x22, 0x41, +0x03, 0x52, 0x44, 0x22, 0x01, +0x03, 0x91, 0x08, 0x34, 0x01, +0x03, 0x92, 0x44, 0x22, 0x41, +0x03, 0x5A, 0x44, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x98, 0x00, 0xE2, 0x01, +0x03, 0xA8, 0x00, 0xF2, 0x01, +0x03, 0x60, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x40, 0x40, 0x01, +0x03, 0x61, 0x08, 0x20, 0x09, +0x03, 0x62, 0x38, 0x20, 0x01, +0xFF, 0xF2, 0x39, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x62, 0x3A, 0x20, 0x01, +0xFF, 0xF2, 0x3B, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x41, 0x40, 0x01, +0x03, 0x61, 0x08, 0x20, 0x09, +0x03, 0x62, 0x3C, 0x20, 0x01, +0xFF, 0xF2, 0x3D, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x42, 0x40, 0x01, +0x03, 0x61, 0x08, 0x20, 0x09, +0x03, 0x62, 0x3E, 0x20, 0x01, +0xFF, 0xF2, 0x3F, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x03, 0x67, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x07, 0xFF, 0x20, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x03, 0x67, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x07, 0xFF, 0x20, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x03, 0x67, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x07, 0xFF, 0x20, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x00, 0x02, 0x43, 0xA0, 0x01, +0xFF, 0xE7, 0xFF, 0x20, 0x01, +0x03, 0x88, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x89, 0x08, 0x40, 0x01, +0xFF, 0xF1, 0x08, 0x20, 0x09, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x88, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x89, 0x08, 0x40, 0x01, +0x03, 0x81, 0x08, 0x20, 0x09, +0x03, 0x8A, 0x45, 0x20, 0x01, +0x03, 0x82, 0x45, 0x22, 0x41, +0x03, 0x81, 0x08, 0x22, 0x01, +0x03, 0x88, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x89, 0x08, 0x20, 0x01, +0x03, 0x78, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x46, 0x22, 0x49, +0xFF, 0xF1, 0x08, 0x20, 0x01, +0xFF, 0xE9, 0x08, 0x20, 0x25, +0x03, 0x70, 0x00, 0xE2, 0x01, +0x03, 0x88, 0x00, 0xC0, 0x01, +0x02, 0xFF, 0xFF, 0x20, 0x01, +0x03, 0x68, 0x00, 0xE2, 0x01, +0x03, 0x69, 0x08, 0x20, 0x01, +0xFF, 0x30, 0x00, 0x02, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +}; + +/* DSP Parameter (Coefficient) Data */ +#define PARAM_SIZE_IC_1 4096 +#define PARAM_ADDR_IC_1 0 +ADI_REG_TYPE Param_Data_IC_1[PARAM_SIZE_IC_1] = { +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x6C, 0xAC, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x7F, 0xC3, 0x65, +0x0F, 0x00, 0x79, 0x35, +0x00, 0x7F, 0xC3, 0x65, +0x00, 0xFF, 0x86, 0xAE, +0x0F, 0x80, 0x79, 0x19, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x0F, 0xFE, 0x2B, 0xE3, +0x00, 0x22, 0xBE, 0x2C, +0x0F, 0xEA, 0xAA, 0xAB, +0x00, 0x6A, 0xAA, 0xAB, +0x0F, 0x9A, 0x69, 0xA7, +0x00, 0xFD, 0xF7, 0xDF, +0x08, 0x3C, 0x6C, 0x20, +0x03, 0xF5, 0xAA, 0x23, +0x01, 0x80, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, +0x00, 0x33, 0x33, 0x33, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x07, 0xDC, +0x00, 0x00, 0x08, 0x00, +0x00, 0x7F, 0xF0, 0x00, +0x0F, 0xFE, 0x2B, 0xE3, +0x00, 0x22, 0xBE, 0x2C, +0x0F, 0xEA, 0xAA, 0xAB, +0x00, 0x6A, 0xAA, 0xAB, +0x0F, 0x9A, 0x69, 0xA7, +0x00, 0xFD, 0xF7, 0xDF, +0x08, 0x3C, 0x6C, 0x20, +0x03, 0xF5, 0xAA, 0x23, +0x01, 0x80, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, +0x00, 0x33, 0x33, 0x33, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x07, 0xDC, +0x00, 0x00, 0x08, 0x00, +0x00, 0x7F, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +}; + + +/* Register Default - IC 1.CoreRegister */ +ADI_REG_TYPE R0_COREREGISTER_IC_1_Default[REG_COREREGISTER_IC_1_BYTE] = { +0x00, 0x18 +}; + +/* Register Default - IC 1.HWConFiguration */ +#define R3_HWCONFIGURATION_IC_1_SIZE 24 +ADI_REG_TYPE R3_HWCONFIGURATION_IC_1_Default[R3_HWCONFIGURATION_IC_1_SIZE] = { +0x00, 0x18, 0x08, 0x08, 0x00, 0x00, 0x44, 0x00, 0x44, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 +}; + +/* Register Default - IC 1.CoreRegister */ +ADI_REG_TYPE R4_COREREGISTER_IC_1_Default[REG_COREREGISTER_IC_1_BYTE] = { +0x00, 0x1C +}; + + +/* + * Default Download + */ +#define DEFAULT_DOWNLOAD_SIZE_IC_1 5 + +void default_download_IC_1() { + SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, REG_COREREGISTER_IC_1_ADDR, REG_COREREGISTER_IC_1_BYTE, R0_COREREGISTER_IC_1_Default ); + SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PROGRAM_ADDR_IC_1, PROGRAM_SIZE_IC_1, Program_Data_IC_1 ); + SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, PARAM_ADDR_IC_1, PARAM_SIZE_IC_1, Param_Data_IC_1 ); + SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, REG_COREREGISTER_IC_1_ADDR , R3_HWCONFIGURATION_IC_1_SIZE, R3_HWCONFIGURATION_IC_1_Default ); + SIGMA_WRITE_REGISTER_BLOCK( DEVICE_ADDR_IC_1, REG_COREREGISTER_IC_1_ADDR, REG_COREREGISTER_IC_1_BYTE, R4_COREREGISTER_IC_1_Default ); +} + +#endif diff --git a/Software/Sigmastudio/DigiRadioTest/DigiRadio_IC_1_PARAM.h b/Software/Sigmastudio/DigiRadioTest/DigiRadio_IC_1_PARAM.h new file mode 100644 index 0000000..ad6221e --- /dev/null +++ b/Software/Sigmastudio/DigiRadioTest/DigiRadio_IC_1_PARAM.h @@ -0,0 +1,459 @@ +/* + * File: C:\Users\mikbi\Documents\Allegati\Desktop\DigiRadioTest\DigiRadio_IC_1_PARAM.h + * + * Created: Thursday, August 6, 2026 1:57:25 PM + * Description: DigiRadio:IC 1 parameter RAM definitions. + * + * This software is distributed in the hope that it will be useful, + * but is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * This software may only be used to program products purchased from + * Analog Devices for incorporation by you into audio products that + * are intended for resale to audio product end users. This software + * may not be distributed whole or in any part to third parties. + * + * Copyright ©2026 Analog Devices, Inc. All rights reserved. + */ +#ifndef __DIGIRADIO_IC_1_PARAM_H__ +#define __DIGIRADIO_IC_1_PARAM_H__ + + +/* Module Beep1 - Beep Sources*/ +#define COUNT_BEEP1 3 +#define DEVICE_BEEP1 "IC1" +#define ADDR_BEEP1_ENABLE 0 +#define FIXPT_BEEP1_ENABLE 0x00000000 +#define VALUE_BEEP1_ENABLE SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_BEEP1_ENABLE SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_BEEP1_KICK 1 +#define FIXPT_BEEP1_KICK 0x00000000 +#define VALUE_BEEP1_KICK SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_BEEP1_KICK SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_BEEP1_BEEP_FREQ 2 +#define FIXPT_BEEP1_BEEP_FREQ 0x00006CAB +#define VALUE_BEEP1_BEEP_FREQ SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.00331636677280911) +#define TYPE_BEEP1_BEEP_FREQ SIGMASTUDIOTYPE_FIXPOINT + +/* Module Si4674 - Multiple Volume Control*/ +#define COUNT_SI4674 2 +#define DEVICE_SI4674 "IC1" +#define ADDR_SI4674 3 +#define FIXPT_SI4674 0x00800000 +#define VALUE_SI4674 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_SI4674 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_SI4674_1 4 +#define FIXPT_SI4674_1 0x00800000 +#define VALUE_SI4674_1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_SI4674_1 SIGMASTUDIOTYPE_FIXPOINT + +/* Module ESP32 - Multiple Volume Control*/ +#define COUNT_ESP32 2 +#define DEVICE_ESP32 "IC1" +#define ADDR_ESP32 5 +#define FIXPT_ESP32 0x00800000 +#define VALUE_ESP32 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_ESP32 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_ESP32_1 6 +#define FIXPT_ESP32_1 0x00800000 +#define VALUE_ESP32_1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_ESP32_1 SIGMASTUDIOTYPE_FIXPOINT + +/* Module St Mixer1 - Stereo Mixer*/ +#define COUNT_STMIXER1 2 +#define DEVICE_STMIXER1 "IC1" +#define ADDR_STMIXER1_ST0_VOLUME 7 +#define FIXPT_STMIXER1_ST0_VOLUME 0x00800000 +#define VALUE_STMIXER1_ST0_VOLUME SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_STMIXER1_ST0_VOLUME SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_STMIXER1_ST1_VOLUME 8 +#define FIXPT_STMIXER1_ST1_VOLUME 0x00800000 +#define VALUE_STMIXER1_ST1_VOLUME SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_STMIXER1_ST1_VOLUME SIGMASTUDIOTYPE_FIXPOINT + +/* Module Param EQ1 - Parametric EQ*/ +#define COUNT_PARAMEQ1 60 +#define DEVICE_PARAMEQ1 "IC1" +#define ADDR_PARAMEQ1_ST0_B0 9 +#define FIXPT_PARAMEQ1_ST0_B0 0x007FC365 +#define VALUE_PARAMEQ1_ST0_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.998150511190452) +#define TYPE_PARAMEQ1_ST0_B0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST0_B0 9 +#define FIXPT_PARAMEQ1_ST0_B0 0x007FC365 +#define VALUE_PARAMEQ1_ST0_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.998150511190452) +#define TYPE_PARAMEQ1_ST0_B0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST0_B1 10 +#define FIXPT_PARAMEQ1_ST0_B1 0xFF007936 +#define VALUE_PARAMEQ1_ST0_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-1.9963010223809) +#define TYPE_PARAMEQ1_ST0_B1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST0_B1 10 +#define FIXPT_PARAMEQ1_ST0_B1 0xFF007936 +#define VALUE_PARAMEQ1_ST0_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-1.9963010223809) +#define TYPE_PARAMEQ1_ST0_B1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST0_B2 11 +#define FIXPT_PARAMEQ1_ST0_B2 0x007FC365 +#define VALUE_PARAMEQ1_ST0_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.998150511190452) +#define TYPE_PARAMEQ1_ST0_B2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST0_B2 11 +#define FIXPT_PARAMEQ1_ST0_B2 0x007FC365 +#define VALUE_PARAMEQ1_ST0_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.998150511190452) +#define TYPE_PARAMEQ1_ST0_B2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST0_A0 12 +#define FIXPT_PARAMEQ1_ST0_A0 0x00FF86AE +#define VALUE_PARAMEQ1_ST0_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1.99629760176912) +#define TYPE_PARAMEQ1_ST0_A0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST0_A0 12 +#define FIXPT_PARAMEQ1_ST0_A0 0x00FF86AE +#define VALUE_PARAMEQ1_ST0_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1.99629760176912) +#define TYPE_PARAMEQ1_ST0_A0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST0_A1 13 +#define FIXPT_PARAMEQ1_ST0_A1 0xFF807919 +#define VALUE_PARAMEQ1_ST0_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.996304442992686) +#define TYPE_PARAMEQ1_ST0_A1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST0_A1 13 +#define FIXPT_PARAMEQ1_ST0_A1 0xFF807919 +#define VALUE_PARAMEQ1_ST0_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.996304442992686) +#define TYPE_PARAMEQ1_ST0_A1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST1_B0 14 +#define FIXPT_PARAMEQ1_ST1_B0 0x00800000 +#define VALUE_PARAMEQ1_ST1_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_PARAMEQ1_ST1_B0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST1_B0 14 +#define FIXPT_PARAMEQ1_ST1_B0 0x00800000 +#define VALUE_PARAMEQ1_ST1_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_PARAMEQ1_ST1_B0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST1_B1 15 +#define FIXPT_PARAMEQ1_ST1_B1 0x00000000 +#define VALUE_PARAMEQ1_ST1_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST1_B1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST1_B1 15 +#define FIXPT_PARAMEQ1_ST1_B1 0x00000000 +#define VALUE_PARAMEQ1_ST1_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST1_B1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST1_B2 16 +#define FIXPT_PARAMEQ1_ST1_B2 0x00000000 +#define VALUE_PARAMEQ1_ST1_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST1_B2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST1_B2 16 +#define FIXPT_PARAMEQ1_ST1_B2 0x00000000 +#define VALUE_PARAMEQ1_ST1_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST1_B2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST1_A0 17 +#define FIXPT_PARAMEQ1_ST1_A0 0x00000000 +#define VALUE_PARAMEQ1_ST1_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST1_A0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST1_A0 17 +#define FIXPT_PARAMEQ1_ST1_A0 0x00000000 +#define VALUE_PARAMEQ1_ST1_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST1_A0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST1_A1 18 +#define FIXPT_PARAMEQ1_ST1_A1 0x00000000 +#define VALUE_PARAMEQ1_ST1_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST1_A1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST1_A1 18 +#define FIXPT_PARAMEQ1_ST1_A1 0x00000000 +#define VALUE_PARAMEQ1_ST1_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST1_A1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST2_B0 19 +#define FIXPT_PARAMEQ1_ST2_B0 0x00800000 +#define VALUE_PARAMEQ1_ST2_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_PARAMEQ1_ST2_B0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST2_B0 19 +#define FIXPT_PARAMEQ1_ST2_B0 0x00800000 +#define VALUE_PARAMEQ1_ST2_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_PARAMEQ1_ST2_B0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST2_B1 20 +#define FIXPT_PARAMEQ1_ST2_B1 0x00000000 +#define VALUE_PARAMEQ1_ST2_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST2_B1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST2_B1 20 +#define FIXPT_PARAMEQ1_ST2_B1 0x00000000 +#define VALUE_PARAMEQ1_ST2_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST2_B1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST2_B2 21 +#define FIXPT_PARAMEQ1_ST2_B2 0x00000000 +#define VALUE_PARAMEQ1_ST2_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST2_B2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST2_B2 21 +#define FIXPT_PARAMEQ1_ST2_B2 0x00000000 +#define VALUE_PARAMEQ1_ST2_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST2_B2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST2_A0 22 +#define FIXPT_PARAMEQ1_ST2_A0 0x00000000 +#define VALUE_PARAMEQ1_ST2_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST2_A0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST2_A0 22 +#define FIXPT_PARAMEQ1_ST2_A0 0x00000000 +#define VALUE_PARAMEQ1_ST2_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST2_A0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST2_A1 23 +#define FIXPT_PARAMEQ1_ST2_A1 0x00000000 +#define VALUE_PARAMEQ1_ST2_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST2_A1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST2_A1 23 +#define FIXPT_PARAMEQ1_ST2_A1 0x00000000 +#define VALUE_PARAMEQ1_ST2_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST2_A1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST3_B0 24 +#define FIXPT_PARAMEQ1_ST3_B0 0x00800000 +#define VALUE_PARAMEQ1_ST3_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_PARAMEQ1_ST3_B0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST3_B0 24 +#define FIXPT_PARAMEQ1_ST3_B0 0x00800000 +#define VALUE_PARAMEQ1_ST3_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_PARAMEQ1_ST3_B0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST3_B1 25 +#define FIXPT_PARAMEQ1_ST3_B1 0x00000000 +#define VALUE_PARAMEQ1_ST3_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST3_B1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST3_B1 25 +#define FIXPT_PARAMEQ1_ST3_B1 0x00000000 +#define VALUE_PARAMEQ1_ST3_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST3_B1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST3_B2 26 +#define FIXPT_PARAMEQ1_ST3_B2 0x00000000 +#define VALUE_PARAMEQ1_ST3_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST3_B2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST3_B2 26 +#define FIXPT_PARAMEQ1_ST3_B2 0x00000000 +#define VALUE_PARAMEQ1_ST3_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST3_B2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST3_A0 27 +#define FIXPT_PARAMEQ1_ST3_A0 0x00000000 +#define VALUE_PARAMEQ1_ST3_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST3_A0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST3_A0 27 +#define FIXPT_PARAMEQ1_ST3_A0 0x00000000 +#define VALUE_PARAMEQ1_ST3_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST3_A0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST3_A1 28 +#define FIXPT_PARAMEQ1_ST3_A1 0x00000000 +#define VALUE_PARAMEQ1_ST3_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST3_A1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST3_A1 28 +#define FIXPT_PARAMEQ1_ST3_A1 0x00000000 +#define VALUE_PARAMEQ1_ST3_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST3_A1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST4_B0 29 +#define FIXPT_PARAMEQ1_ST4_B0 0x00800000 +#define VALUE_PARAMEQ1_ST4_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_PARAMEQ1_ST4_B0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST4_B0 29 +#define FIXPT_PARAMEQ1_ST4_B0 0x00800000 +#define VALUE_PARAMEQ1_ST4_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_PARAMEQ1_ST4_B0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST4_B1 30 +#define FIXPT_PARAMEQ1_ST4_B1 0x00000000 +#define VALUE_PARAMEQ1_ST4_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST4_B1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST4_B1 30 +#define FIXPT_PARAMEQ1_ST4_B1 0x00000000 +#define VALUE_PARAMEQ1_ST4_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST4_B1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST4_B2 31 +#define FIXPT_PARAMEQ1_ST4_B2 0x00000000 +#define VALUE_PARAMEQ1_ST4_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST4_B2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST4_B2 31 +#define FIXPT_PARAMEQ1_ST4_B2 0x00000000 +#define VALUE_PARAMEQ1_ST4_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST4_B2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST4_A0 32 +#define FIXPT_PARAMEQ1_ST4_A0 0x00000000 +#define VALUE_PARAMEQ1_ST4_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST4_A0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST4_A0 32 +#define FIXPT_PARAMEQ1_ST4_A0 0x00000000 +#define VALUE_PARAMEQ1_ST4_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST4_A0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST4_A1 33 +#define FIXPT_PARAMEQ1_ST4_A1 0x00000000 +#define VALUE_PARAMEQ1_ST4_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST4_A1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST4_A1 33 +#define FIXPT_PARAMEQ1_ST4_A1 0x00000000 +#define VALUE_PARAMEQ1_ST4_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST4_A1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST5_B0 34 +#define FIXPT_PARAMEQ1_ST5_B0 0x00800000 +#define VALUE_PARAMEQ1_ST5_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_PARAMEQ1_ST5_B0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST5_B0 34 +#define FIXPT_PARAMEQ1_ST5_B0 0x00800000 +#define VALUE_PARAMEQ1_ST5_B0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_PARAMEQ1_ST5_B0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST5_B1 35 +#define FIXPT_PARAMEQ1_ST5_B1 0x00000000 +#define VALUE_PARAMEQ1_ST5_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST5_B1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST5_B1 35 +#define FIXPT_PARAMEQ1_ST5_B1 0x00000000 +#define VALUE_PARAMEQ1_ST5_B1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST5_B1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST5_B2 36 +#define FIXPT_PARAMEQ1_ST5_B2 0x00000000 +#define VALUE_PARAMEQ1_ST5_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST5_B2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST5_B2 36 +#define FIXPT_PARAMEQ1_ST5_B2 0x00000000 +#define VALUE_PARAMEQ1_ST5_B2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST5_B2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST5_A0 37 +#define FIXPT_PARAMEQ1_ST5_A0 0x00000000 +#define VALUE_PARAMEQ1_ST5_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST5_A0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST5_A0 37 +#define FIXPT_PARAMEQ1_ST5_A0 0x00000000 +#define VALUE_PARAMEQ1_ST5_A0 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST5_A0 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST5_A1 38 +#define FIXPT_PARAMEQ1_ST5_A1 0x00000000 +#define VALUE_PARAMEQ1_ST5_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST5_A1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_PARAMEQ1_ST5_A1 38 +#define FIXPT_PARAMEQ1_ST5_A1 0x00000000 +#define VALUE_PARAMEQ1_ST5_A1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0) +#define TYPE_PARAMEQ1_ST5_A1 SIGMASTUDIOTYPE_FIXPOINT + +/* Module Multiple 1 - Multiple Volume Control*/ +#define COUNT_MULTIPLE1 2 +#define DEVICE_MULTIPLE1 "IC1" +#define ADDR_MULTIPLE1 39 +#define FIXPT_MULTIPLE1 0x00800000 +#define VALUE_MULTIPLE1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_MULTIPLE1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_MULTIPLE1_1 40 +#define FIXPT_MULTIPLE1_1 0x00800000 +#define VALUE_MULTIPLE1_1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_MULTIPLE1_1 SIGMASTUDIOTYPE_FIXPOINT + +/* Module Limiter 1 - Limiter*/ +#define COUNT_LIMITER1 15 +#define DEVICE_LIMITER1 "IC1" +#define ADDR_LIMITER1_S1 41 +#define FIXPT_LIMITER1_S1 0xFFFE2BE3 +#define VALUE_LIMITER1_S1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.01428571428571) +#define TYPE_LIMITER1_S1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_INT1 42 +#define FIXPT_LIMITER1_INT1 0x0022BE2B +#define VALUE_LIMITER1_INT1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.27142857142857) +#define TYPE_LIMITER1_INT1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_S2 43 +#define FIXPT_LIMITER1_S2 0xFFEAAAAB +#define VALUE_LIMITER1_S2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.16666666666667) +#define TYPE_LIMITER1_S2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_INT2 44 +#define FIXPT_LIMITER1_INT2 0x006AAAAA +#define VALUE_LIMITER1_INT2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.8333333333333) +#define TYPE_LIMITER1_INT2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_S3 45 +#define FIXPT_LIMITER1_S3 0xFF9A69A7 +#define VALUE_LIMITER1_S3 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.79365079365079) +#define TYPE_LIMITER1_S3 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_INT3 46 +#define FIXPT_LIMITER1_INT3 0x00FDF7DF +#define VALUE_LIMITER1_INT3 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1.98412698412698) +#define TYPE_LIMITER1_INT3 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_S4 47 +#define FIXPT_LIMITER1_S4 0xF83C6C20 +#define VALUE_LIMITER1_S4 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-15.527950310559) +#define TYPE_LIMITER1_S4 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_INT4 48 +#define FIXPT_LIMITER1_INT4 0x03F5AA22 +#define VALUE_LIMITER1_INT4 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(7.91925465838509) +#define TYPE_LIMITER1_INT4 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_C1 49 +#define FIXPT_LIMITER1_C1 0x01800000 +#define VALUE_LIMITER1_C1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(3) +#define TYPE_LIMITER1_C1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_C2 50 +#define FIXPT_LIMITER1_C2 0x01000000 +#define VALUE_LIMITER1_C2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(2) +#define TYPE_LIMITER1_C2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_C3 51 +#define FIXPT_LIMITER1_C3 0x00333333 +#define VALUE_LIMITER1_C3 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.4) +#define TYPE_LIMITER1_C3 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_THRESHOLD 52 +#define FIXPT_LIMITER1_THRESHOLD 0x00800000 +#define VALUE_LIMITER1_THRESHOLD SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_LIMITER1_THRESHOLD SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_RMS 53 +#define FIXPT_LIMITER1_RMS 0x000007DC +#define VALUE_LIMITER1_RMS SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.000239881380791562) +#define TYPE_LIMITER1_RMS SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_DECAY 54 +#define FIXPT_LIMITER1_DECAY 0x00000800 +#define VALUE_LIMITER1_DECAY SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.000244140625) +#define TYPE_LIMITER1_DECAY SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER1_DECAYCOMPLEMENT 55 +#define FIXPT_LIMITER1_DECAYCOMPLEMENT 0x007FF000 +#define VALUE_LIMITER1_DECAYCOMPLEMENT SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.99951171875) +#define TYPE_LIMITER1_DECAYCOMPLEMENT SIGMASTUDIOTYPE_FIXPOINT + +/* Module Limiter 2 - Limiter*/ +#define COUNT_LIMITER2 15 +#define DEVICE_LIMITER2 "IC1" +#define ADDR_LIMITER2_S1 56 +#define FIXPT_LIMITER2_S1 0xFFFE2BE3 +#define VALUE_LIMITER2_S1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.01428571428571) +#define TYPE_LIMITER2_S1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_INT1 57 +#define FIXPT_LIMITER2_INT1 0x0022BE2B +#define VALUE_LIMITER2_INT1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.27142857142857) +#define TYPE_LIMITER2_INT1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_S2 58 +#define FIXPT_LIMITER2_S2 0xFFEAAAAB +#define VALUE_LIMITER2_S2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.16666666666667) +#define TYPE_LIMITER2_S2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_INT2 59 +#define FIXPT_LIMITER2_INT2 0x006AAAAA +#define VALUE_LIMITER2_INT2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.8333333333333) +#define TYPE_LIMITER2_INT2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_S3 60 +#define FIXPT_LIMITER2_S3 0xFF9A69A7 +#define VALUE_LIMITER2_S3 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-0.79365079365079) +#define TYPE_LIMITER2_S3 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_INT3 61 +#define FIXPT_LIMITER2_INT3 0x00FDF7DF +#define VALUE_LIMITER2_INT3 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1.98412698412698) +#define TYPE_LIMITER2_INT3 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_S4 62 +#define FIXPT_LIMITER2_S4 0xF83C6C20 +#define VALUE_LIMITER2_S4 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(-15.527950310559) +#define TYPE_LIMITER2_S4 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_INT4 63 +#define FIXPT_LIMITER2_INT4 0x03F5AA22 +#define VALUE_LIMITER2_INT4 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(7.91925465838509) +#define TYPE_LIMITER2_INT4 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_C1 64 +#define FIXPT_LIMITER2_C1 0x01800000 +#define VALUE_LIMITER2_C1 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(3) +#define TYPE_LIMITER2_C1 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_C2 65 +#define FIXPT_LIMITER2_C2 0x01000000 +#define VALUE_LIMITER2_C2 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(2) +#define TYPE_LIMITER2_C2 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_C3 66 +#define FIXPT_LIMITER2_C3 0x00333333 +#define VALUE_LIMITER2_C3 SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.4) +#define TYPE_LIMITER2_C3 SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_THRESHOLD 67 +#define FIXPT_LIMITER2_THRESHOLD 0x00800000 +#define VALUE_LIMITER2_THRESHOLD SIGMASTUDIOTYPE_FIXPOINT_CONVERT(1) +#define TYPE_LIMITER2_THRESHOLD SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_RMS 68 +#define FIXPT_LIMITER2_RMS 0x000007DC +#define VALUE_LIMITER2_RMS SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.000239881380791562) +#define TYPE_LIMITER2_RMS SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_DECAY 69 +#define FIXPT_LIMITER2_DECAY 0x00000800 +#define VALUE_LIMITER2_DECAY SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.000244140625) +#define TYPE_LIMITER2_DECAY SIGMASTUDIOTYPE_FIXPOINT +#define ADDR_LIMITER2_DECAYCOMPLEMENT 70 +#define FIXPT_LIMITER2_DECAYCOMPLEMENT 0x007FF000 +#define VALUE_LIMITER2_DECAYCOMPLEMENT SIGMASTUDIOTYPE_FIXPOINT_CONVERT(0.99951171875) +#define TYPE_LIMITER2_DECAYCOMPLEMENT SIGMASTUDIOTYPE_FIXPOINT + +#endif diff --git a/Software/Sigmastudio/DigiRadioTest/DigiRadio_IC_1_REG.h b/Software/Sigmastudio/DigiRadioTest/DigiRadio_IC_1_REG.h new file mode 100644 index 0000000..cd3004e --- /dev/null +++ b/Software/Sigmastudio/DigiRadioTest/DigiRadio_IC_1_REG.h @@ -0,0 +1,565 @@ +/* + * File: C:\Users\mikbi\Documents\Allegati\Desktop\DigiRadioTest\DigiRadio_IC_1_REG.h + * + * Created: Thursday, August 6, 2026 1:57:25 PM + * Description: DigiRadio:IC 1 control register definitions. + * + * This software is distributed in the hope that it will be useful, + * but is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * This software may only be used to program products purchased from + * Analog Devices for incorporation by you into audio products that + * are intended for resale to audio product end users. This software + * may not be distributed whole or in any part to third parties. + * + * Copyright ©2026 Analog Devices, Inc. All rights reserved. + */ +#ifndef __DIGIRADIO_IC_1_REG_H__ +#define __DIGIRADIO_IC_1_REG_H__ + + +/* InterfaceRegister0 - Registers (IC 1) */ +#define REG_INTERFACEREGISTER0_IC_1_ADDR 0x800 +#define REG_INTERFACEREGISTER0_IC_1_BYTE 4 +#define REG_INTERFACEREGISTER0_IC_1_VALUE 0x0 + +/* InterfaceRegister1 - Registers (IC 1) */ +#define REG_INTERFACEREGISTER1_IC_1_ADDR 0x801 +#define REG_INTERFACEREGISTER1_IC_1_BYTE 4 +#define REG_INTERFACEREGISTER1_IC_1_VALUE 0x0 + +/* InterfaceRegister2 - Registers (IC 1) */ +#define REG_INTERFACEREGISTER2_IC_1_ADDR 0x802 +#define REG_INTERFACEREGISTER2_IC_1_BYTE 4 +#define REG_INTERFACEREGISTER2_IC_1_VALUE 0x0 + +/* InterfaceRegister3 - Registers (IC 1) */ +#define REG_INTERFACEREGISTER3_IC_1_ADDR 0x803 +#define REG_INTERFACEREGISTER3_IC_1_BYTE 4 +#define REG_INTERFACEREGISTER3_IC_1_VALUE 0x0 + +/* InterfaceRegister4 - Registers (IC 1) */ +#define REG_INTERFACEREGISTER4_IC_1_ADDR 0x804 +#define REG_INTERFACEREGISTER4_IC_1_BYTE 4 +#define REG_INTERFACEREGISTER4_IC_1_VALUE 0x0 + +/* InterfaceRegister5 - Registers (IC 1) */ +#define REG_INTERFACEREGISTER5_IC_1_ADDR 0x805 +#define REG_INTERFACEREGISTER5_IC_1_BYTE 4 +#define REG_INTERFACEREGISTER5_IC_1_VALUE 0x0 + +/* InterfaceRegister6 - Registers (IC 1) */ +#define REG_INTERFACEREGISTER6_IC_1_ADDR 0x806 +#define REG_INTERFACEREGISTER6_IC_1_BYTE 4 +#define REG_INTERFACEREGISTER6_IC_1_VALUE 0x0 + +/* InterfaceRegister7 - Registers (IC 1) */ +#define REG_INTERFACEREGISTER7_IC_1_ADDR 0x807 +#define REG_INTERFACEREGISTER7_IC_1_BYTE 4 +#define REG_INTERFACEREGISTER7_IC_1_VALUE 0x0 + +/* GpioAllRegister - Registers (IC 1) */ +#define REG_GPIOALLREGISTER_IC_1_ADDR 0x808 +#define REG_GPIOALLREGISTER_IC_1_BYTE 2 +#define REG_GPIOALLREGISTER_IC_1_VALUE 0x0 + +/* Adc0 - Registers (IC 1) */ +#define REG_ADC0_IC_1_ADDR 0x809 +#define REG_ADC0_IC_1_BYTE 1 +#define REG_ADC0_IC_1_VALUE 0x0 + +/* Adc1 - Registers (IC 1) */ +#define REG_ADC1_IC_1_ADDR 0x80A +#define REG_ADC1_IC_1_BYTE 1 +#define REG_ADC1_IC_1_VALUE 0x0 + +/* Adc2 - Registers (IC 1) */ +#define REG_ADC2_IC_1_ADDR 0x80B +#define REG_ADC2_IC_1_BYTE 1 +#define REG_ADC2_IC_1_VALUE 0x0 + +/* Adc3 - Registers (IC 1) */ +#define REG_ADC3_IC_1_ADDR 0x80C +#define REG_ADC3_IC_1_BYTE 1 +#define REG_ADC3_IC_1_VALUE 0x0 + +/* CoreRegister - Registers (IC 1) */ +#define REG_COREREGISTER_IC_1_ADDR 0x81C +#define REG_COREREGISTER_IC_1_BYTE 2 +#define REG_COREREGISTER_IC_1_VALUE 0x1C + +/* RAMRegister - Registers (IC 1) */ +#define REG_RAMREGISTER_IC_1_ADDR 0x81D +#define REG_RAMREGISTER_IC_1_BYTE 1 +#define REG_RAMREGISTER_IC_1_VALUE 0x8 + +/* SerialOutRegister1 - Registers (IC 1) */ +#define REG_SERIALOUTREGISTER1_IC_1_ADDR 0x81E +#define REG_SERIALOUTREGISTER1_IC_1_BYTE 2 +#define REG_SERIALOUTREGISTER1_IC_1_VALUE 0x800 + +/* SerialInputRegister - Registers (IC 1) */ +#define REG_SERIALINPUTREGISTER_IC_1_ADDR 0x81F +#define REG_SERIALINPUTREGISTER_IC_1_BYTE 1 +#define REG_SERIALINPUTREGISTER_IC_1_VALUE 0x0 + +/* MpCfg0 - Registers (IC 1) */ +#define REG_MPCFG0_IC_1_ADDR 0x820 +#define REG_MPCFG0_IC_1_BYTE 3 +#define REG_MPCFG0_IC_1_VALUE 0x440044 + +/* MpCfg1 - Registers (IC 1) */ +#define REG_MPCFG1_IC_1_ADDR 0x821 +#define REG_MPCFG1_IC_1_BYTE 3 +#define REG_MPCFG1_IC_1_VALUE 0x440004 + +/* AnalogPowerDownRegister - Registers (IC 1) */ +#define REG_ANALOGPOWERDOWNREGISTER_IC_1_ADDR 0x822 +#define REG_ANALOGPOWERDOWNREGISTER_IC_1_BYTE 2 +#define REG_ANALOGPOWERDOWNREGISTER_IC_1_VALUE 0x0 + +/* TestRegister - Registers (IC 1) */ +#define REG_TESTREGISTER_IC_1_ADDR 0x823 +#define REG_TESTREGISTER_IC_1_BYTE 2 +#define REG_TESTREGISTER_IC_1_VALUE 0x0 + +/* AnalogInterfaceRegister0 - Registers (IC 1) */ +#define REG_ANALOGINTERFACEREGISTER0_IC_1_ADDR 0x824 +#define REG_ANALOGINTERFACEREGISTER0_IC_1_BYTE 2 +#define REG_ANALOGINTERFACEREGISTER0_IC_1_VALUE 0x8000 + +/* AnalogInterfaceRegister1 - Registers (IC 1) */ +#define REG_ANALOGINTERFACEREGISTER1_IC_1_ADDR 0x825 +#define REG_ANALOGINTERFACEREGISTER1_IC_1_BYTE 2 +#define REG_ANALOGINTERFACEREGISTER1_IC_1_VALUE 0x0 + +/* AnalogInterfaceRegister2 - Registers (IC 1) */ +#define REG_ANALOGINTERFACEREGISTER2_IC_1_ADDR 0x826 +#define REG_ANALOGINTERFACEREGISTER2_IC_1_BYTE 2 +#define REG_ANALOGINTERFACEREGISTER2_IC_1_VALUE 0x0 + +/* AnalogInterfaceRegister3 - Registers (IC 1) */ +#define REG_ANALOGINTERFACEREGISTER3_IC_1_ADDR 0x827 +#define REG_ANALOGINTERFACEREGISTER3_IC_1_BYTE 2 +#define REG_ANALOGINTERFACEREGISTER3_IC_1_VALUE 0x1 + + +/* + * + * Control register's field descriptions + * + */ + +/* InterfaceRegister0 (IC 1) */ +#define R0_INTERFACEREGISTER0_IC_1 0x00000000 /* 00000000000000000000000000000000b [31:0] */ +#define R0_INTERFACEREGISTER0_IC_1_MASK 0xFFFFFFFF +#define R0_INTERFACEREGISTER0_IC_1_SHIFT 0 + +/* InterfaceRegister1 (IC 1) */ +#define R1_INTERFACEREGISTER1_IC_1 0x00000000 /* 00000000000000000000000000000000b [31:0] */ +#define R1_INTERFACEREGISTER1_IC_1_MASK 0xFFFFFFFF +#define R1_INTERFACEREGISTER1_IC_1_SHIFT 0 + +/* InterfaceRegister2 (IC 1) */ +#define R2_INTERFACEREGISTER2_IC_1 0x00000000 /* 00000000000000000000000000000000b [31:0] */ +#define R2_INTERFACEREGISTER2_IC_1_MASK 0xFFFFFFFF +#define R2_INTERFACEREGISTER2_IC_1_SHIFT 0 + +/* InterfaceRegister3 (IC 1) */ +#define R3_INTERFACEREGISTER3_IC_1 0x00000000 /* 00000000000000000000000000000000b [31:0] */ +#define R3_INTERFACEREGISTER3_IC_1_MASK 0xFFFFFFFF +#define R3_INTERFACEREGISTER3_IC_1_SHIFT 0 + +/* InterfaceRegister4 (IC 1) */ +#define R4_INTERFACEREGISTER4_IC_1 0x00000000 /* 00000000000000000000000000000000b [31:0] */ +#define R4_INTERFACEREGISTER4_IC_1_MASK 0xFFFFFFFF +#define R4_INTERFACEREGISTER4_IC_1_SHIFT 0 + +/* InterfaceRegister5 (IC 1) */ +#define R5_INTERFACEREGISTER5_IC_1 0x00000000 /* 00000000000000000000000000000000b [31:0] */ +#define R5_INTERFACEREGISTER5_IC_1_MASK 0xFFFFFFFF +#define R5_INTERFACEREGISTER5_IC_1_SHIFT 0 + +/* InterfaceRegister6 (IC 1) */ +#define R6_INTERFACEREGISTER6_IC_1 0x00000000 /* 00000000000000000000000000000000b [31:0] */ +#define R6_INTERFACEREGISTER6_IC_1_MASK 0xFFFFFFFF +#define R6_INTERFACEREGISTER6_IC_1_SHIFT 0 + +/* InterfaceRegister7 (IC 1) */ +#define R7_INTERFACEREGISTER7_IC_1 0x00000000 /* 00000000000000000000000000000000b [31:0] */ +#define R7_INTERFACEREGISTER7_IC_1_MASK 0xFFFFFFFF +#define R7_INTERFACEREGISTER7_IC_1_SHIFT 0 + +/* GpioAllRegister (IC 1) */ +#define R8_PIN0_IC_1 0x0 /* 0b [0] */ +#define R8_PIN1_IC_1 0x0 /* 0b [1] */ +#define R8_PIN2_IC_1 0x0 /* 0b [2] */ +#define R8_PIN3_IC_1 0x0 /* 0b [3] */ +#define R8_PIN4_IC_1 0x0 /* 0b [4] */ +#define R8_PIN5_IC_1 0x0 /* 0b [5] */ +#define R8_PIN6_IC_1 0x0 /* 0b [6] */ +#define R8_PIN7_IC_1 0x0 /* 0b [7] */ +#define R8_PIN8_IC_1 0x0 /* 0b [8] */ +#define R8_PIN9_IC_1 0x0 /* 0b [9] */ +#define R8_PIN10_IC_1 0x0 /* 0b [10] */ +#define R8_PIN11_IC_1 0x0 /* 0b [11] */ +#define R8_PIN0_IC_1_MASK 0x1 +#define R8_PIN0_IC_1_SHIFT 0 +#define R8_PIN1_IC_1_MASK 0x2 +#define R8_PIN1_IC_1_SHIFT 1 +#define R8_PIN2_IC_1_MASK 0x4 +#define R8_PIN2_IC_1_SHIFT 2 +#define R8_PIN3_IC_1_MASK 0x8 +#define R8_PIN3_IC_1_SHIFT 3 +#define R8_PIN4_IC_1_MASK 0x10 +#define R8_PIN4_IC_1_SHIFT 4 +#define R8_PIN5_IC_1_MASK 0x20 +#define R8_PIN5_IC_1_SHIFT 5 +#define R8_PIN6_IC_1_MASK 0x40 +#define R8_PIN6_IC_1_SHIFT 6 +#define R8_PIN7_IC_1_MASK 0x80 +#define R8_PIN7_IC_1_SHIFT 7 +#define R8_PIN8_IC_1_MASK 0x100 +#define R8_PIN8_IC_1_SHIFT 8 +#define R8_PIN9_IC_1_MASK 0x200 +#define R8_PIN9_IC_1_SHIFT 9 +#define R8_PIN10_IC_1_MASK 0x400 +#define R8_PIN10_IC_1_SHIFT 10 +#define R8_PIN11_IC_1_MASK 0x800 +#define R8_PIN11_IC_1_SHIFT 11 + +/* Adc0 (IC 1) */ +#define R9_ADC0_IC_1 0x00 /* 00000000b [7:0] */ +#define R9_ADC0_IC_1_MASK 0xFF +#define R9_ADC0_IC_1_SHIFT 0 + +/* Adc1 (IC 1) */ +#define R10_ADC1_IC_1 0x00 /* 00000000b [7:0] */ +#define R10_ADC1_IC_1_MASK 0xFF +#define R10_ADC1_IC_1_SHIFT 0 + +/* Adc2 (IC 1) */ +#define R11_ADC2_IC_1 0x00 /* 00000000b [7:0] */ +#define R11_ADC2_IC_1_MASK 0xFF +#define R11_ADC2_IC_1_SHIFT 0 + +/* Adc3 (IC 1) */ +#define R12_ADC3_IC_1 0x00 /* 00000000b [7:0] */ +#define R12_ADC3_IC_1_MASK 0xFF +#define R12_ADC3_IC_1_SHIFT 0 + +/* CoreRegister (IC 1) */ +#define R13_PROGRAM_LENGTH_IC_1 0x0 /* 00b [1:0] */ +#define R13_REGISTER_ZERO_IC_1 0x1 /* 1b [2] */ +#define R13_MUTE_DAC_IC_1 0x1 /* 1b [3] */ +#define R13_MUTE_ADC_IC_1 0x1 /* 1b [4] */ +#define R13_SAFELOAD_IC_1 0x0 /* 0b [5] */ +#define R13_WRITESPI_INTERFACEREG_IC_1 0x0 /* 0b [6] */ +#define R13_WRITESPI_GPIO_IC_1 0x0 /* 0b [7] */ +#define R13_WRITESPI_ADC_IC_1 0x0 /* 0b [8] */ +#define R13_MUTE_SERIALIN_IC_1 0x0 /* 0b [9] */ +#define R13_GPIO_DEBOUNCE_IC_1 0x0 /* 00b [11:10] */ +#define R13_EXTMEM_SPEED_IC_1 0x0 /* 00b [13:12] */ +#define R13_PROGRAM_LENGTH_IC_1_MASK 0x3 +#define R13_PROGRAM_LENGTH_IC_1_SHIFT 0 +#define R13_REGISTER_ZERO_IC_1_MASK 0x4 +#define R13_REGISTER_ZERO_IC_1_SHIFT 2 +#define R13_MUTE_DAC_IC_1_MASK 0x8 +#define R13_MUTE_DAC_IC_1_SHIFT 3 +#define R13_MUTE_ADC_IC_1_MASK 0x10 +#define R13_MUTE_ADC_IC_1_SHIFT 4 +#define R13_SAFELOAD_IC_1_MASK 0x20 +#define R13_SAFELOAD_IC_1_SHIFT 5 +#define R13_WRITESPI_INTERFACEREG_IC_1_MASK 0x40 +#define R13_WRITESPI_INTERFACEREG_IC_1_SHIFT 6 +#define R13_WRITESPI_GPIO_IC_1_MASK 0x80 +#define R13_WRITESPI_GPIO_IC_1_SHIFT 7 +#define R13_WRITESPI_ADC_IC_1_MASK 0x100 +#define R13_WRITESPI_ADC_IC_1_SHIFT 8 +#define R13_MUTE_SERIALIN_IC_1_MASK 0x200 +#define R13_MUTE_SERIALIN_IC_1_SHIFT 9 +#define R13_GPIO_DEBOUNCE_IC_1_MASK 0xC00 +#define R13_GPIO_DEBOUNCE_IC_1_SHIFT 10 +#define R13_EXTMEM_SPEED_IC_1_MASK 0x3000 +#define R13_EXTMEM_SPEED_IC_1_SHIFT 12 + +/* RAMRegister (IC 1) */ +#define R14_RAM_MODULO_IC_1 0x8 /* 1000b [3:0] */ +#define R14_RAM_MODULO_IC_1_MASK 0xF +#define R14_RAM_MODULO_IC_1_SHIFT 0 + +/* SerialOutRegister1 (IC 1) */ +#define R15_WORDLENGTH_IC_1 0x0 /* 00b [1:0] */ +#define R15_MSB_POS_IC_1 0x0 /* 000b [4:2] */ +#define R15_TDM_IC_1 0x0 /* 0b [5] */ +#define R15_FRAMESYNC_TYPE_IC_1 0x0 /* 0b [6] */ +#define R15_LRCLK_FREQ_IC_1 0x0 /* 00b [8:7] */ +#define R15_BCLK_FREQ_IC_1 0x0 /* 00b [10:9] */ +#define R15_MASTER_SLAVE_IC_1 0x1 /* 1b [11] */ +#define R15_BCLK_POLARITY_IC_1 0x0 /* 0b [12] */ +#define R15_LRCLK_POLARITY_IC_1 0x0 /* 0b [13] */ +#define R15_WORDLENGTH_IC_1_MASK 0x3 +#define R15_WORDLENGTH_IC_1_SHIFT 0 +#define R15_MSB_POS_IC_1_MASK 0x1C +#define R15_MSB_POS_IC_1_SHIFT 2 +#define R15_TDM_IC_1_MASK 0x20 +#define R15_TDM_IC_1_SHIFT 5 +#define R15_FRAMESYNC_TYPE_IC_1_MASK 0x40 +#define R15_FRAMESYNC_TYPE_IC_1_SHIFT 6 +#define R15_LRCLK_FREQ_IC_1_MASK 0x180 +#define R15_LRCLK_FREQ_IC_1_SHIFT 7 +#define R15_BCLK_FREQ_IC_1_MASK 0x600 +#define R15_BCLK_FREQ_IC_1_SHIFT 9 +#define R15_MASTER_SLAVE_IC_1_MASK 0x800 +#define R15_MASTER_SLAVE_IC_1_SHIFT 11 +#define R15_BCLK_POLARITY_IC_1_MASK 0x1000 +#define R15_BCLK_POLARITY_IC_1_SHIFT 12 +#define R15_LRCLK_POLARITY_IC_1_MASK 0x2000 +#define R15_LRCLK_POLARITY_IC_1_SHIFT 13 + +/* SerialInputRegister (IC 1) */ +#define R16_INPUT_MODE_IC_1 0x0 /* 000b [2:0] */ +#define R16_BCLK_POLARITY_IC_1 0x0 /* 0b [3] */ +#define R16_LRCLK_POLARITY_IC_1 0x0 /* 0b [4] */ +#define R16_INPUT_MODE_IC_1_MASK 0x7 +#define R16_INPUT_MODE_IC_1_SHIFT 0 +#define R16_BCLK_POLARITY_IC_1_MASK 0x8 +#define R16_BCLK_POLARITY_IC_1_SHIFT 3 +#define R16_LRCLK_POLARITY_IC_1_MASK 0x10 +#define R16_LRCLK_POLARITY_IC_1_SHIFT 4 + +/* MpCfg0 (IC 1) */ +#define R17_MFSELECT0_IC_1 0x4 /* 100b [2:0] */ +#define R17_MFINVERT0_IC_1 0x0 /* 0b [3] */ +#define R17_MFSELECT1_IC_1 0x4 /* 100b [6:4] */ +#define R17_MFINVERT1_IC_1 0x0 /* 0b [7] */ +#define R17_MFSELECT2_IC_1 0x0 /* 000b [10:8] */ +#define R17_MFINVERT2_IC_1 0x0 /* 0b [11] */ +#define R17_MFSELECT3_IC_1 0x0 /* 000b [14:12] */ +#define R17_MFINVERT3_IC_1 0x0 /* 0b [15] */ +#define R17_MFSELECT4_IC_1 0x4 /* 100b [18:16] */ +#define R17_MFINVERT4_IC_1 0x0 /* 0b [19] */ +#define R17_MFSELECT5_IC_1 0x4 /* 100b [22:20] */ +#define R17_MFINVERT5_IC_1 0x0 /* 0b [23] */ +#define R17_MFSELECT0_IC_1_MASK 0x7 +#define R17_MFSELECT0_IC_1_SHIFT 0 +#define R17_MFINVERT0_IC_1_MASK 0x8 +#define R17_MFINVERT0_IC_1_SHIFT 3 +#define R17_MFSELECT1_IC_1_MASK 0x70 +#define R17_MFSELECT1_IC_1_SHIFT 4 +#define R17_MFINVERT1_IC_1_MASK 0x80 +#define R17_MFINVERT1_IC_1_SHIFT 7 +#define R17_MFSELECT2_IC_1_MASK 0x700 +#define R17_MFSELECT2_IC_1_SHIFT 8 +#define R17_MFINVERT2_IC_1_MASK 0x800 +#define R17_MFINVERT2_IC_1_SHIFT 11 +#define R17_MFSELECT3_IC_1_MASK 0x7000 +#define R17_MFSELECT3_IC_1_SHIFT 12 +#define R17_MFINVERT3_IC_1_MASK 0x8000 +#define R17_MFINVERT3_IC_1_SHIFT 15 +#define R17_MFSELECT4_IC_1_MASK 0x70000 +#define R17_MFSELECT4_IC_1_SHIFT 16 +#define R17_MFINVERT4_IC_1_MASK 0x80000 +#define R17_MFINVERT4_IC_1_SHIFT 19 +#define R17_MFSELECT5_IC_1_MASK 0x700000 +#define R17_MFSELECT5_IC_1_SHIFT 20 +#define R17_MFINVERT5_IC_1_MASK 0x800000 +#define R17_MFINVERT5_IC_1_SHIFT 23 + +/* MpCfg1 (IC 1) */ +#define R18_MFSELECT6_IC_1 0x4 /* 100b [2:0] */ +#define R18_MFINVERT6_IC_1 0x0 /* 0b [3] */ +#define R18_MFSELECT7_IC_1 0x0 /* 000b [6:4] */ +#define R18_MFINVERT7_IC_1 0x0 /* 0b [7] */ +#define R18_MFSELECT8_IC_1 0x0 /* 000b [10:8] */ +#define R18_MFINVERT8_IC_1 0x0 /* 0b [11] */ +#define R18_MFSELECT9_IC_1 0x0 /* 000b [14:12] */ +#define R18_MFINVERT9_IC_1 0x0 /* 0b [15] */ +#define R18_MFSELECT10_IC_1 0x4 /* 100b [18:16] */ +#define R18_MFINVERT10_IC_1 0x0 /* 0b [19] */ +#define R18_MFSELECT11_IC_1 0x4 /* 100b [22:20] */ +#define R18_MFINVERT11_IC_1 0x0 /* 0b [23] */ +#define R18_MFSELECT6_IC_1_MASK 0x7 +#define R18_MFSELECT6_IC_1_SHIFT 0 +#define R18_MFINVERT6_IC_1_MASK 0x8 +#define R18_MFINVERT6_IC_1_SHIFT 3 +#define R18_MFSELECT7_IC_1_MASK 0x70 +#define R18_MFSELECT7_IC_1_SHIFT 4 +#define R18_MFINVERT7_IC_1_MASK 0x80 +#define R18_MFINVERT7_IC_1_SHIFT 7 +#define R18_MFSELECT8_IC_1_MASK 0x700 +#define R18_MFSELECT8_IC_1_SHIFT 8 +#define R18_MFINVERT8_IC_1_MASK 0x800 +#define R18_MFINVERT8_IC_1_SHIFT 11 +#define R18_MFSELECT9_IC_1_MASK 0x7000 +#define R18_MFSELECT9_IC_1_SHIFT 12 +#define R18_MFINVERT9_IC_1_MASK 0x8000 +#define R18_MFINVERT9_IC_1_SHIFT 15 +#define R18_MFSELECT10_IC_1_MASK 0x70000 +#define R18_MFSELECT10_IC_1_SHIFT 16 +#define R18_MFINVERT10_IC_1_MASK 0x80000 +#define R18_MFINVERT10_IC_1_SHIFT 19 +#define R18_MFSELECT11_IC_1_MASK 0x700000 +#define R18_MFSELECT11_IC_1_SHIFT 20 +#define R18_MFINVERT11_IC_1_MASK 0x800000 +#define R18_MFINVERT11_IC_1_SHIFT 23 + +/* AnalogPowerDownRegister (IC 1) */ +#define R19_DAC3_POWERDOWN_IC_1 0x0 /* 0b [0] */ +#define R19_DAC2_POWERDOWN_IC_1 0x0 /* 0b [1] */ +#define R19_DAC1_POWERDOWN_IC_1 0x0 /* 0b [2] */ +#define R19_DAC0_POWERDOWN_IC_1 0x0 /* 0b [3] */ +#define R19_DACS_RESET_IC_1 0x0 /* 0b [4] */ +#define R19_REF_CORE_POWERDOWN_IC_1 0x0 /* 0b [5] */ +#define R19_REF_BUF_POWERDOWN_IC_1 0x0 /* 0b [6] */ +#define R19_ADCS_POWERDOWN_IC_1 0x0 /* 0b [7] */ +#define R19_AUX_ADC_FILTER_IC_1 0x0 /* 000b [10:8] */ +#define R19_DAC3_POWERDOWN_IC_1_MASK 0x1 +#define R19_DAC3_POWERDOWN_IC_1_SHIFT 0 +#define R19_DAC2_POWERDOWN_IC_1_MASK 0x2 +#define R19_DAC2_POWERDOWN_IC_1_SHIFT 1 +#define R19_DAC1_POWERDOWN_IC_1_MASK 0x4 +#define R19_DAC1_POWERDOWN_IC_1_SHIFT 2 +#define R19_DAC0_POWERDOWN_IC_1_MASK 0x8 +#define R19_DAC0_POWERDOWN_IC_1_SHIFT 3 +#define R19_DACS_RESET_IC_1_MASK 0x10 +#define R19_DACS_RESET_IC_1_SHIFT 4 +#define R19_REF_CORE_POWERDOWN_IC_1_MASK 0x20 +#define R19_REF_CORE_POWERDOWN_IC_1_SHIFT 5 +#define R19_REF_BUF_POWERDOWN_IC_1_MASK 0x40 +#define R19_REF_BUF_POWERDOWN_IC_1_SHIFT 6 +#define R19_ADCS_POWERDOWN_IC_1_MASK 0x80 +#define R19_ADCS_POWERDOWN_IC_1_SHIFT 7 +#define R19_AUX_ADC_FILTER_IC_1_MASK 0x700 +#define R19_AUX_ADC_FILTER_IC_1_SHIFT 8 + +/* TestRegister (IC 1) */ +#define R20_ADCCLOCKDELAY_IC_1 0x0 /* 000b [2:0] */ +#define R20_ADCSYNCFILTL_SDATAA_D_IC_1 0x0 /* 0b [3] */ +#define R20_ADCSYNCFILTR_SDATAA_D_IC_1 0x0 /* 0b [4] */ +#define R20_SPIKEFILT_SEROUT0_1_IC_1 0x0 /* 0b [5] */ +#define R20_UNUSED_IC_1 0x00 /* 0000000000b [15:6] */ +#define R20_ADCCLOCKDELAY_IC_1_MASK 0x7 +#define R20_ADCCLOCKDELAY_IC_1_SHIFT 0 +#define R20_ADCSYNCFILTL_SDATAA_D_IC_1_MASK 0x8 +#define R20_ADCSYNCFILTL_SDATAA_D_IC_1_SHIFT 3 +#define R20_ADCSYNCFILTR_SDATAA_D_IC_1_MASK 0x10 +#define R20_ADCSYNCFILTR_SDATAA_D_IC_1_SHIFT 4 +#define R20_SPIKEFILT_SEROUT0_1_IC_1_MASK 0x20 +#define R20_SPIKEFILT_SEROUT0_1_IC_1_SHIFT 5 +#define R20_UNUSED_IC_1_MASK 0xFFC0 +#define R20_UNUSED_IC_1_SHIFT 6 + +/* AnalogInterfaceRegister0 (IC 1) */ +#define R21_CHOP_ENB_INT_AMP_IC_1 0x0 /* 0b [0] */ +#define R21_PD_INT_AMP_IC_1 0x0 /* 0b [1] */ +#define R21_ADC_NON_OVERLAP_ADJ_IC_1 0x0 /* 0b [2] */ +#define R21_ADC_I_SEL_IC_1 0x0 /* 00000b [7:3] */ +#define R21_ADC_CLK_ADJ_IC_1 0x0 /* 000b [10:8] */ +#define R21_LCHOP_PMOS_CTRL_IC_1 0x0 /* 00b [12:11] */ +#define R21_LCHOP_AMP_ENB_IC_1 0x0 /* 0b [13] */ +#define R21_LSCRAM_ENB_IC_1 0x0 /* 0b [14] */ +#define R21_AUX_ADC_EN_IC_1 0x1 /* 1b [15] */ +#define R21_CHOP_ENB_INT_AMP_IC_1_MASK 0x1 +#define R21_CHOP_ENB_INT_AMP_IC_1_SHIFT 0 +#define R21_PD_INT_AMP_IC_1_MASK 0x2 +#define R21_PD_INT_AMP_IC_1_SHIFT 1 +#define R21_ADC_NON_OVERLAP_ADJ_IC_1_MASK 0x4 +#define R21_ADC_NON_OVERLAP_ADJ_IC_1_SHIFT 2 +#define R21_ADC_I_SEL_IC_1_MASK 0xF8 +#define R21_ADC_I_SEL_IC_1_SHIFT 3 +#define R21_ADC_CLK_ADJ_IC_1_MASK 0x700 +#define R21_ADC_CLK_ADJ_IC_1_SHIFT 8 +#define R21_LCHOP_PMOS_CTRL_IC_1_MASK 0x1800 +#define R21_LCHOP_PMOS_CTRL_IC_1_SHIFT 11 +#define R21_LCHOP_AMP_ENB_IC_1_MASK 0x2000 +#define R21_LCHOP_AMP_ENB_IC_1_SHIFT 13 +#define R21_LSCRAM_ENB_IC_1_MASK 0x4000 +#define R21_LSCRAM_ENB_IC_1_SHIFT 14 +#define R21_AUX_ADC_EN_IC_1_MASK 0x8000 +#define R21_AUX_ADC_EN_IC_1_SHIFT 15 + +/* AnalogInterfaceRegister1 (IC 1) */ +#define R22_RSWC_DAC_CTRL_IC_1 0x0 /* 00b [1:0] */ +#define R22_RCLK_SEL_PMOS_IC_1 0x0 /* 00b [3:2] */ +#define R22_RCLK_SEL_AMP_IC_1 0x0 /* 00b [5:4] */ +#define R22_RCHOP_PMOS_CTRL_IC_1 0x0 /* 00b [7:6] */ +#define R22_LCLK_SEL_PMOS_IC_1 0x0 /* 00b [9:8] */ +#define R22_LSWC_DAC_CTRL_IC_1 0x0 /* 00b [11:10] */ +#define R22_CLK_SEL_INT_AMP_IC_1 0x0 /* 00b [13:12] */ +#define R22_RSWC_DAC_CTRL_IC_1_MASK 0x3 +#define R22_RSWC_DAC_CTRL_IC_1_SHIFT 0 +#define R22_RCLK_SEL_PMOS_IC_1_MASK 0xC +#define R22_RCLK_SEL_PMOS_IC_1_SHIFT 2 +#define R22_RCLK_SEL_AMP_IC_1_MASK 0x30 +#define R22_RCLK_SEL_AMP_IC_1_SHIFT 4 +#define R22_RCHOP_PMOS_CTRL_IC_1_MASK 0xC0 +#define R22_RCHOP_PMOS_CTRL_IC_1_SHIFT 6 +#define R22_LCLK_SEL_PMOS_IC_1_MASK 0x300 +#define R22_LCLK_SEL_PMOS_IC_1_SHIFT 8 +#define R22_LSWC_DAC_CTRL_IC_1_MASK 0xC00 +#define R22_LSWC_DAC_CTRL_IC_1_SHIFT 10 +#define R22_CLK_SEL_INT_AMP_IC_1_MASK 0x3000 +#define R22_CLK_SEL_INT_AMP_IC_1_SHIFT 12 + +/* AnalogInterfaceRegister2 (IC 1) */ +#define R23_UNUSED_IC_1 0x0 /* 0b [0] */ +#define R23_ADC_DITHER_EN_IC_1 0x0 /* 0b [1] */ +#define R23_XTAL_ENB_IC_1 0x0 /* 0b [2] */ +#define R23_PLL_PD_IC_1 0x0 /* 0b [3] */ +#define R23_IBIAS_TO_PIN_IC_1 0x0 /* 0b [4] */ +#define R23_IBIAS_ADJ_IC_1 0x0 /* 0000b [8:5] */ +#define R23_VREF_TRIM_IC_1 0x0 /* 0000b [12:9] */ +#define R23_REF_I_SEL_IC_1 0x0 /* 0b [13] */ +#define R23_RSCRAM_ENB_IC_1 0x0 /* 0b [14] */ +#define R23_LCHOP_AMP_ENB_IC_1 0x0 /* 0b [15] */ +#define R23_UNUSED_IC_1_MASK 0x1 +#define R23_UNUSED_IC_1_SHIFT 0 +#define R23_ADC_DITHER_EN_IC_1_MASK 0x2 +#define R23_ADC_DITHER_EN_IC_1_SHIFT 1 +#define R23_XTAL_ENB_IC_1_MASK 0x4 +#define R23_XTAL_ENB_IC_1_SHIFT 2 +#define R23_PLL_PD_IC_1_MASK 0x8 +#define R23_PLL_PD_IC_1_SHIFT 3 +#define R23_IBIAS_TO_PIN_IC_1_MASK 0x10 +#define R23_IBIAS_TO_PIN_IC_1_SHIFT 4 +#define R23_IBIAS_ADJ_IC_1_MASK 0x1E0 +#define R23_IBIAS_ADJ_IC_1_SHIFT 5 +#define R23_VREF_TRIM_IC_1_MASK 0x1E00 +#define R23_VREF_TRIM_IC_1_SHIFT 9 +#define R23_REF_I_SEL_IC_1_MASK 0x2000 +#define R23_REF_I_SEL_IC_1_SHIFT 13 +#define R23_RSCRAM_ENB_IC_1_MASK 0x4000 +#define R23_RSCRAM_ENB_IC_1_SHIFT 14 +#define R23_LCHOP_AMP_ENB_IC_1_MASK 0x8000 +#define R23_LCHOP_AMP_ENB_IC_1_SHIFT 15 + +/* AnalogInterfaceRegister3 (IC 1) */ +#define R24_DAC_OFFSET_IC_1 0x1 /* 01b [1:0] */ +#define R24_DAC_DITHER_ENABLE_IC_1 0x0 /* 0b [2] */ +#define R24_PCTRL_IC_1 0x0 /* 00b [4:3] */ +#define R24_DAC_PCLK_SEL_IC_1 0x0 /* 00b [6:5] */ +#define R24_DAC_I_SEL_IC_1 0x0 /* 0000b [10:7] */ +#define R24_DAC_CLK_SEL_IC_1 0x0 /* 00b [12:11] */ +#define R24_DAC_CHOP_ENB_IC_1 0x0 /* 0b [13] */ +#define R24_DAC_DRTZ_IC_1 0x0 /* 00b [15:14] */ +#define R24_DAC_OFFSET_IC_1_MASK 0x3 +#define R24_DAC_OFFSET_IC_1_SHIFT 0 +#define R24_DAC_DITHER_ENABLE_IC_1_MASK 0x4 +#define R24_DAC_DITHER_ENABLE_IC_1_SHIFT 2 +#define R24_PCTRL_IC_1_MASK 0x18 +#define R24_PCTRL_IC_1_SHIFT 3 +#define R24_DAC_PCLK_SEL_IC_1_MASK 0x60 +#define R24_DAC_PCLK_SEL_IC_1_SHIFT 5 +#define R24_DAC_I_SEL_IC_1_MASK 0x780 +#define R24_DAC_I_SEL_IC_1_SHIFT 7 +#define R24_DAC_CLK_SEL_IC_1_MASK 0x1800 +#define R24_DAC_CLK_SEL_IC_1_SHIFT 11 +#define R24_DAC_CHOP_ENB_IC_1_MASK 0x2000 +#define R24_DAC_CHOP_ENB_IC_1_SHIFT 13 +#define R24_DAC_DRTZ_IC_1_MASK 0xC000 +#define R24_DAC_DRTZ_IC_1_SHIFT 14 + +#endif diff --git a/Software/Sigmastudio/DigiRadioTest/DigiRadio_NetList.xml b/Software/Sigmastudio/DigiRadioTest/DigiRadio_NetList.xml new file mode 100644 index 0000000..009ac47 --- /dev/null +++ b/Software/Sigmastudio/DigiRadioTest/DigiRadio_NetList.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Software/Sigmastudio/DigiRadioTest/NumBytes_IC_1.dat b/Software/Sigmastudio/DigiRadioTest/NumBytes_IC_1.dat new file mode 100644 index 0000000..8ced699 --- /dev/null +++ b/Software/Sigmastudio/DigiRadioTest/NumBytes_IC_1.dat @@ -0,0 +1,5 @@ +4, +5122, +4098, +26, +4, diff --git a/Software/Sigmastudio/DigiRadioTest/TxBuffer_IC_1.dat b/Software/Sigmastudio/DigiRadioTest/TxBuffer_IC_1.dat new file mode 100644 index 0000000..d95dd36 --- /dev/null +++ b/Software/Sigmastudio/DigiRadioTest/TxBuffer_IC_1.dat @@ -0,0 +1,2060 @@ +0x08, 0x1C, /* (0) IC 1.CoreRegister */ +0x00, 0x18, +0x04, 0x00, /* (1) Program Data */ +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0xE8, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x08, 0x00, 0xE8, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x10, 0x00, 0xE8, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x18, 0x00, 0xE8, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x20, 0x00, 0xE8, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x28, 0x00, 0xE8, 0x01, +0x00, 0x02, 0x01, 0xA0, 0x01, +0xFF, 0xE1, 0x07, 0x20, 0x01, +0x00, 0x38, 0x00, 0xE2, 0x01, +0x00, 0x42, 0x02, 0x20, 0x01, +0x00, 0x52, 0x00, 0x22, 0x01, +0x00, 0x58, 0x00, 0xE2, 0x01, +0x00, 0x42, 0x00, 0x20, 0x01, +0x00, 0x59, 0x08, 0x22, 0x41, +0x00, 0x39, 0x08, 0x22, 0x01, +0x00, 0x31, 0x08, 0x22, 0x41, +0x00, 0x48, 0x00, 0xE2, 0x01, +0x00, 0x12, 0x03, 0x20, 0x01, +0x00, 0x60, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x1A, 0x04, 0x20, 0x01, +0x00, 0x68, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x22, 0x05, 0x20, 0x01, +0x00, 0x70, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x2A, 0x06, 0x20, 0x01, +0x00, 0x78, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x59, 0x08, 0x20, 0x01, +0xFF, 0x28, 0x00, 0x02, 0x01, +0x00, 0x62, 0x07, 0x20, 0x01, +0x00, 0x6A, 0x07, 0x40, 0x01, +0x00, 0x72, 0x08, 0x22, 0x01, +0x00, 0x7A, 0x08, 0x44, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x90, 0x00, 0xE2, 0x01, +0x01, 0xC8, 0x00, 0xE4, 0x01, +0x00, 0xBA, 0x0C, 0x20, 0x01, +0x00, 0xB2, 0x0D, 0x22, 0x01, +0x00, 0xA2, 0x0C, 0x34, 0x01, +0x00, 0x9A, 0x0D, 0x22, 0x01, +0x00, 0x92, 0x09, 0x22, 0x01, +0x00, 0x8A, 0x0A, 0x22, 0x01, +0x00, 0x82, 0x0B, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0xA8, 0x00, 0xE2, 0x01, +0x00, 0xC0, 0x00, 0xF2, 0x01, +0x00, 0xEA, 0x11, 0x20, 0x01, +0x00, 0xE2, 0x12, 0x22, 0x01, +0x00, 0xD2, 0x11, 0x34, 0x01, +0x00, 0xCA, 0x12, 0x22, 0x01, +0x00, 0xAA, 0x0E, 0x22, 0x01, +0x00, 0xA2, 0x0F, 0x22, 0x01, +0x00, 0x9A, 0x10, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0xD8, 0x00, 0xE2, 0x01, +0x00, 0xF0, 0x00, 0xF2, 0x01, +0x01, 0x1A, 0x16, 0x20, 0x01, +0x01, 0x12, 0x17, 0x22, 0x01, +0x01, 0x02, 0x16, 0x34, 0x01, +0x00, 0xFA, 0x17, 0x22, 0x01, +0x00, 0xDA, 0x13, 0x22, 0x01, +0x00, 0xD2, 0x14, 0x22, 0x01, +0x00, 0xCA, 0x15, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x08, 0x00, 0xE2, 0x01, +0x01, 0x20, 0x00, 0xF2, 0x01, +0x01, 0x4A, 0x1B, 0x20, 0x01, +0x01, 0x42, 0x1C, 0x22, 0x01, +0x01, 0x32, 0x1B, 0x34, 0x01, +0x01, 0x2A, 0x1C, 0x22, 0x01, +0x01, 0x0A, 0x18, 0x22, 0x01, +0x01, 0x02, 0x19, 0x22, 0x01, +0x00, 0xFA, 0x1A, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x38, 0x00, 0xE2, 0x01, +0x01, 0x50, 0x00, 0xF2, 0x01, +0x01, 0x7A, 0x20, 0x20, 0x01, +0x01, 0x72, 0x21, 0x22, 0x01, +0x01, 0x62, 0x20, 0x34, 0x01, +0x01, 0x5A, 0x21, 0x22, 0x01, +0x01, 0x3A, 0x1D, 0x22, 0x01, +0x01, 0x32, 0x1E, 0x22, 0x01, +0x01, 0x2A, 0x1F, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x68, 0x00, 0xE2, 0x01, +0x01, 0x80, 0x00, 0xF2, 0x01, +0x01, 0xAA, 0x25, 0x20, 0x01, +0x01, 0xA2, 0x26, 0x22, 0x01, +0x01, 0x92, 0x25, 0x34, 0x01, +0x01, 0x8A, 0x26, 0x22, 0x01, +0x01, 0x6A, 0x22, 0x22, 0x01, +0x01, 0x62, 0x23, 0x22, 0x01, +0x01, 0x5A, 0x24, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x98, 0x00, 0xE2, 0x01, +0x01, 0xB0, 0x00, 0xF2, 0x01, +0x01, 0xF2, 0x0C, 0x20, 0x01, +0x01, 0xEA, 0x0D, 0x22, 0x01, +0x01, 0xDA, 0x0C, 0x34, 0x01, +0x01, 0xD2, 0x0D, 0x22, 0x01, +0x01, 0xCA, 0x09, 0x22, 0x01, +0x01, 0xC2, 0x0A, 0x22, 0x01, +0x01, 0xBA, 0x0B, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0xE0, 0x00, 0xE2, 0x01, +0x01, 0xF8, 0x00, 0xF2, 0x01, +0x02, 0x22, 0x11, 0x20, 0x01, +0x02, 0x1A, 0x12, 0x22, 0x01, +0x02, 0x0A, 0x11, 0x34, 0x01, +0x02, 0x02, 0x12, 0x22, 0x01, +0x01, 0xE2, 0x0E, 0x22, 0x01, +0x01, 0xDA, 0x0F, 0x22, 0x01, +0x01, 0xD2, 0x10, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0x10, 0x00, 0xE2, 0x01, +0x02, 0x28, 0x00, 0xF2, 0x01, +0x02, 0x52, 0x16, 0x20, 0x01, +0x02, 0x4A, 0x17, 0x22, 0x01, +0x02, 0x3A, 0x16, 0x34, 0x01, +0x02, 0x32, 0x17, 0x22, 0x01, +0x02, 0x12, 0x13, 0x22, 0x01, +0x02, 0x0A, 0x14, 0x22, 0x01, +0x02, 0x02, 0x15, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0x40, 0x00, 0xE2, 0x01, +0x02, 0x58, 0x00, 0xF2, 0x01, +0x02, 0x82, 0x1B, 0x20, 0x01, +0x02, 0x7A, 0x1C, 0x22, 0x01, +0x02, 0x6A, 0x1B, 0x34, 0x01, +0x02, 0x62, 0x1C, 0x22, 0x01, +0x02, 0x42, 0x18, 0x22, 0x01, +0x02, 0x3A, 0x19, 0x22, 0x01, +0x02, 0x32, 0x1A, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0x70, 0x00, 0xE2, 0x01, +0x02, 0x88, 0x00, 0xF2, 0x01, +0x02, 0xB2, 0x20, 0x20, 0x01, +0x02, 0xAA, 0x21, 0x22, 0x01, +0x02, 0x9A, 0x20, 0x34, 0x01, +0x02, 0x92, 0x21, 0x22, 0x01, +0x02, 0x72, 0x1D, 0x22, 0x01, +0x02, 0x6A, 0x1E, 0x22, 0x01, +0x02, 0x62, 0x1F, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0xA0, 0x00, 0xE2, 0x01, +0x02, 0xB8, 0x00, 0xF2, 0x01, +0x02, 0xE2, 0x25, 0x20, 0x01, +0x02, 0xDA, 0x26, 0x22, 0x01, +0x02, 0xCA, 0x25, 0x34, 0x01, +0x02, 0xC2, 0x26, 0x22, 0x01, +0x02, 0xA2, 0x22, 0x22, 0x01, +0x02, 0x9A, 0x23, 0x22, 0x01, +0x02, 0x92, 0x24, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0xD0, 0x00, 0xE2, 0x01, +0x02, 0xE8, 0x00, 0xF2, 0x01, +0x01, 0x9A, 0x27, 0x20, 0x01, +0x02, 0xF0, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0xD2, 0x28, 0x20, 0x01, +0x02, 0xF8, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x02, 0xF1, 0x08, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x58, 0x00, 0xF0, 0x01, +0xFF, 0xE9, 0x08, 0x22, 0x01, +0x03, 0x50, 0x00, 0xF2, 0x01, +0x03, 0x41, 0x08, 0x20, 0x01, +0x03, 0x42, 0x35, 0x22, 0x41, +0x03, 0x52, 0x35, 0x22, 0x01, +0x03, 0x31, 0x08, 0x34, 0x01, +0x03, 0x32, 0x35, 0x22, 0x41, +0x03, 0x5A, 0x35, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x38, 0x00, 0xE2, 0x01, +0x03, 0x48, 0x00, 0xF2, 0x01, +0x03, 0x60, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x31, 0x40, 0x01, +0x03, 0x61, 0x08, 0x20, 0x09, +0x03, 0x62, 0x29, 0x20, 0x01, +0xFF, 0xF2, 0x2A, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x62, 0x2B, 0x20, 0x01, +0xFF, 0xF2, 0x2C, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x32, 0x40, 0x01, +0x03, 0x61, 0x08, 0x20, 0x09, +0x03, 0x62, 0x2D, 0x20, 0x01, +0xFF, 0xF2, 0x2E, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x33, 0x40, 0x01, +0x03, 0x61, 0x08, 0x20, 0x09, +0x03, 0x62, 0x2F, 0x20, 0x01, +0xFF, 0xF2, 0x30, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x03, 0x67, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x07, 0xFF, 0x20, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x03, 0x67, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x07, 0xFF, 0x20, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x03, 0x67, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x07, 0xFF, 0x20, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x00, 0x02, 0x34, 0xA0, 0x01, +0xFF, 0xE7, 0xFF, 0x20, 0x01, +0x03, 0x28, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x29, 0x08, 0x40, 0x01, +0xFF, 0xF1, 0x08, 0x20, 0x09, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x28, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x29, 0x08, 0x40, 0x01, +0x03, 0x21, 0x08, 0x20, 0x09, +0x03, 0x2A, 0x36, 0x20, 0x01, +0x03, 0x22, 0x36, 0x22, 0x41, +0x03, 0x21, 0x08, 0x22, 0x01, +0x03, 0x28, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x29, 0x08, 0x20, 0x01, +0x03, 0x18, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x37, 0x22, 0x49, +0xFF, 0xF1, 0x08, 0x20, 0x01, +0xFF, 0xE9, 0x08, 0x20, 0x25, +0x03, 0x10, 0x00, 0xE2, 0x01, +0x03, 0x28, 0x00, 0xC0, 0x01, +0x02, 0xF7, 0xFF, 0x20, 0x01, +0x03, 0x08, 0x00, 0xE2, 0x01, +0x02, 0xF9, 0x08, 0x20, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x58, 0x00, 0xF0, 0x01, +0xFF, 0xE9, 0x08, 0x22, 0x01, +0x03, 0x50, 0x00, 0xF2, 0x01, +0x03, 0xA1, 0x08, 0x20, 0x01, +0x03, 0xA2, 0x44, 0x22, 0x41, +0x03, 0x52, 0x44, 0x22, 0x01, +0x03, 0x91, 0x08, 0x34, 0x01, +0x03, 0x92, 0x44, 0x22, 0x41, +0x03, 0x5A, 0x44, 0x22, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x98, 0x00, 0xE2, 0x01, +0x03, 0xA8, 0x00, 0xF2, 0x01, +0x03, 0x60, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x40, 0x40, 0x01, +0x03, 0x61, 0x08, 0x20, 0x09, +0x03, 0x62, 0x38, 0x20, 0x01, +0xFF, 0xF2, 0x39, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x62, 0x3A, 0x20, 0x01, +0xFF, 0xF2, 0x3B, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x41, 0x40, 0x01, +0x03, 0x61, 0x08, 0x20, 0x09, +0x03, 0x62, 0x3C, 0x20, 0x01, +0xFF, 0xF2, 0x3D, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x23, +0xFF, 0xF2, 0x42, 0x40, 0x01, +0x03, 0x61, 0x08, 0x20, 0x09, +0x03, 0x62, 0x3E, 0x20, 0x01, +0xFF, 0xF2, 0x3F, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x03, 0x67, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x07, 0xFF, 0x20, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x03, 0x67, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x07, 0xFF, 0x20, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x03, 0x67, 0xFF, 0x20, 0x41, +0xFF, 0xF1, 0x07, 0x22, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x07, 0xFF, 0x20, 0x01, +0x03, 0x00, 0x00, 0xE2, 0x01, +0x03, 0x00, 0x00, 0xC0, 0x01, +0x00, 0x02, 0x43, 0xA0, 0x01, +0xFF, 0xE7, 0xFF, 0x20, 0x01, +0x03, 0x88, 0x00, 0xE2, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x89, 0x08, 0x40, 0x01, +0xFF, 0xF1, 0x08, 0x20, 0x09, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x88, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x89, 0x08, 0x40, 0x01, +0x03, 0x81, 0x08, 0x20, 0x09, +0x03, 0x8A, 0x45, 0x20, 0x01, +0x03, 0x82, 0x45, 0x22, 0x41, +0x03, 0x81, 0x08, 0x22, 0x01, +0x03, 0x88, 0x00, 0xE2, 0x23, +0x00, 0x00, 0x00, 0x00, 0x01, +0x03, 0x89, 0x08, 0x20, 0x01, +0x03, 0x78, 0x00, 0xE2, 0x01, +0xFF, 0xF2, 0x46, 0x22, 0x49, +0xFF, 0xF1, 0x08, 0x20, 0x01, +0xFF, 0xE9, 0x08, 0x20, 0x25, +0x03, 0x70, 0x00, 0xE2, 0x01, +0x03, 0x88, 0x00, 0xC0, 0x01, +0x02, 0xFF, 0xFF, 0x20, 0x01, +0x03, 0x68, 0x00, 0xE2, 0x01, +0x03, 0x69, 0x08, 0x20, 0x01, +0xFF, 0x30, 0x00, 0x02, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, /* (2) Param */ +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x6C, 0xAC, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x7F, 0xC3, 0x65, +0x0F, 0x00, 0x79, 0x35, +0x00, 0x7F, 0xC3, 0x65, +0x00, 0xFF, 0x86, 0xAE, +0x0F, 0x80, 0x79, 0x19, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, +0x0F, 0xFE, 0x2B, 0xE3, +0x00, 0x22, 0xBE, 0x2C, +0x0F, 0xEA, 0xAA, 0xAB, +0x00, 0x6A, 0xAA, 0xAB, +0x0F, 0x9A, 0x69, 0xA7, +0x00, 0xFD, 0xF7, 0xDF, +0x08, 0x3C, 0x6C, 0x20, +0x03, 0xF5, 0xAA, 0x23, +0x01, 0x80, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, +0x00, 0x33, 0x33, 0x33, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x07, 0xDC, +0x00, 0x00, 0x08, 0x00, +0x00, 0x7F, 0xF0, 0x00, +0x0F, 0xFE, 0x2B, 0xE3, +0x00, 0x22, 0xBE, 0x2C, +0x0F, 0xEA, 0xAA, 0xAB, +0x00, 0x6A, 0xAA, 0xAB, +0x0F, 0x9A, 0x69, 0xA7, +0x00, 0xFD, 0xF7, 0xDF, +0x08, 0x3C, 0x6C, 0x20, +0x03, 0xF5, 0xAA, 0x23, +0x01, 0x80, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, +0x00, 0x33, 0x33, 0x33, +0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x07, 0xDC, +0x00, 0x00, 0x08, 0x00, +0x00, 0x7F, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x08, 0x1C, /* (3) IC 1.HWConFiguration */ +0x00, 0x18, 0x08, 0x08, 0x00, +0x00, 0x44, 0x00, 0x44, 0x44, +0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, +0x08, 0x1C, /* (4) IC 1.CoreRegister */ +0x00, 0x1C, diff --git a/Software/Sigmastudio/DigiRadioTest/defines.h b/Software/Sigmastudio/DigiRadioTest/defines.h new file mode 100644 index 0000000..237917f --- /dev/null +++ b/Software/Sigmastudio/DigiRadioTest/defines.h @@ -0,0 +1,26 @@ +/* + * File: defines.h + * + * Created: Thursday, August 6, 2026 1:57:25 PM + * Description: DigiRadio IC default download data definitions. + * + * This software is distributed in the hope that it will be useful, + * but is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * This software may only be used to program products purchased from + * Analog Devices for incorporation by you into audio products that + * are intended for resale to audio product end users. This software + * may not be distributed whole or in any part to third parties. + * + * Copyright ©2026 Analog Devices, Inc. All rights reserved. + */ +#ifndef __DEFINES_H__ +#define __DEFINES_H__ + +#define BufferSize_IC_1 9254 +#define NumTransactions_IC_1 5 + + +#endif diff --git a/Software/Sigmastudio/DigiRadioTest/digiradio_beep_enabled.drad b/Software/Sigmastudio/DigiRadioTest/digiradio_beep_enabled.drad new file mode 100644 index 0000000000000000000000000000000000000000..54e778940eb5760a17f20275641af7a53aab55c7 GIT binary patch literal 9276 zcmeI2Piz!*6vy9tKX9iN-BJ;kQel`{TowenZ4oNU?z$M{BH2^vNjD+Dh6D5jy|DIR zYEQZ+v!}Wj$zqJ*WH^`xFQzB5C(@88#YF6>Y-0G6$oPFTJ3}$?)P#iOH_5(zZ@<6q z?>F;#GrzQ(Etc{{ruDS#lSdc&9U)55I@&}y7_WO8kU4SI6KAP7bK@+nneZI@cM>ks zL0V!e2(l7+OyfaGC{H?Go(?(qY)G?XD)br%pK2B?*|!emnYi@UqdXs%nU_#rjLVab z%YGUwQ(4!oByvoXI{lP`s|)7)3WNDq`h)5E1`N6O3e?7i5vICkwJwC&ZiMNV5dy~* zoqnF$Ov@YLSn7q)+6c#jX3bX-8cBqD4?^I$rH&OixNoz|-1~;dESuqYjEojvLuhS6 zSa=;l9qi~?x#~E+6^=qb9NDcS%o)wPQ#!#G41U}fIg}}%P{))D$K(zSDZ6k?Xg2mH zLUtQMW_#pNh+I`ia}bWkPN=m(IA%4gcnIYIgo(Ez$2aQuQ5|it;$;xxMX=(QW(#1& zH^7RoN38gFbv%SaJg|~J5Rz`N5<$jGV8x4I#jS{y^uQr$b(FwLj)Rblft6%6>jf+6 z1}l+>mE_bhu8wK2k|_|93Rp>5vjSMj7+6U*VkLUN$c#F!ft55tNa|oEHO(f$N-AI_ z<%pHcspBVgEP<6Q?u5DkR&qnL23ScQtfUsPlAG$d2M5>RhGPX~&{}DwQ9g{z`?y5| z!Hm-i`+wo?G}=a!hhPe$Ufz^O@!60w!X~Tb1j^8%JvYa6us$Dtdnm`|Gso>R%zC%g+>w6mx`GFYwbc!%L$a>x#&}2t~~8RE*Ev-ph7$ZTiAs$ zE#C`EbRi#)JFLR{u~3MG4^%kP5uQ&MKAh`xVFs5KF8SrNU4YQ(f(qty?ZWI)m(BE1 zFOL$ZyLt$OicjZxs7A@E_qBcofAY!hyX5`6C%N3bN|ol-Wc}=S^v{FeoWti_^LKLqUwefQ&hYSX zcwULygl{wH^2(aLtFFSPmVhN-30MM_fF)oFSOS)SC143y0+zrFO`zXN;nzS8{#h#G zmsXexf~-Uy(?n1b%A<~#r+p624QqBtgUW6gpk`_`d68JFIAl&9k|^Bl@Eae35n z*-v9-D(kwHM2=}%r=M|fcfovLVlZE!>r9t6V93Q6pf)y)GSxM!bs@}mBg{UJ5ID~3 z^o!JHTHOf8N-u=gMmUxR5w=`!>7Gy{~x8vKfxM$Y}W`gw`g6 zrI!)Z!H!;)tB%84;VAUOk=;7VoYAa1r4wwy;Jba1Lz(gsb18Qv$j(N>09zuBlVRC!q_*xx5sG|*5yb40R3|8FIYzeIR zGFb7Yh!tN|#~nDt11sqRA?XGy5oEjqR=f;W+=^I94;+$KM+vOtFbK&wSV>m1Ua*pG zuo8(_NlqOT>X-#9nE@fGfR&UrD}a@ZgOy|>R-(^~%&FrdSV-*uihjVN`aojFb9>R0q z&cH@Gq`XthU12%kx3lrMH&u8m7Di&>Z54KRgm5*YMK&jVH}Bs{gaVs{?{?OBQk7(M zf&CjgUpj(ghMXMxAk-CJ0fd1tQ^9Q0Tg~i&!`tKKQR1o|9s(g1aCyi3NM}*H?x4{p z4C5AAZtH3eO8NW0y6}y5p;5&2r6Q*PO1n_gauQ{DE&5iN^AEa^%SBz-s}T3W7ItA= z%Xh;PUC77d_N#Cp77DTOo(k`Ggs0Pm4;DIIn8R&_OMdZa7a(-Hpn~~KyD)#yWixxw z%cI2QK0E}%8BFE3KYXMMr; zXkP=n71*87?u2$Hv^$~Q37_gt*rV@Uc%1ruHBbMEJ3Njf`5_(}ff-zTeQw*=!t zZC;>C^Fp#d^)3B#`*&ymDcAhf9KgT5!WU;` zWF(wB@f+d4nRIULiM+T{dsqUNfF)oFSOS)SC143y0+xU!U parseEnhanceLevelJson( std::string_view json); +/** + * @brief parseBeepEnabledJson — parse POST body {"enabled":true|false}. + * + * @dname parseBeepEnabledJson + * @param json Untrusted request body. + * @return Parsed enabled flag, or ParseError. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-07 + */ +[[nodiscard]] std::expected parseBeepEnabledJson( + std::string_view json); + } // namespace core diff --git a/Software/components/core/include/core/BluetoothJson.hpp b/Software/components/core/include/core/BluetoothJson.hpp index 9adc3d0..80c2842 100644 --- a/Software/components/core/include/core/BluetoothJson.hpp +++ b/Software/components/core/include/core/BluetoothJson.hpp @@ -14,6 +14,8 @@ #include "core/Bt1035At.hpp" #include "core/Bt1035PairedDevice.hpp" +#include "core/Bt1035ScannedDevice.hpp" +#include "core/BtSpeakerTarget.hpp" #include #include @@ -39,6 +41,22 @@ struct BluetoothStatus { std::uint8_t autoReconnect; ///< Power-on reconnect count (0 = off). }; +/** + * @brief BluetoothConnectRequest — POST /api/bluetooth/connect body. + * + * @dname BluetoothConnectRequest + * @return n/a (type) + * @pubstate Parsed by parseBluetoothConnectJson(). + * + * @author Michele Bigi + * @date 2026-08-05 + */ +struct BluetoothConnectRequest { + std::string mac; ///< 12-char module MAC. + std::string name; ///< Optional label stored when save is true. + bool save; ///< Persist as default speaker on success. +}; + /** * @brief serializeBluetoothStatusJson — serialise BluetoothStatus for HTTP. * @@ -94,4 +112,74 @@ struct BluetoothStatus { [[nodiscard]] std::expected parseBluetoothAutoReconnectJson(std::string_view json); +/** + * @brief serializeBluetoothScanJson — serialise scan result list. + * + * @dname serializeBluetoothScanJson + * @param devices Parsed +SCAN entries. + * @return JSON object with a devices array. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string serializeBluetoothScanJson( + const std::vector& devices); + +/** + * @brief parseBluetoothConnectJson — validate POST /api/bluetooth/connect. + * + * @dname parseBluetoothConnectJson + * @param json Request body with 12-char \c mac field. + * @return Normalised uppercase MAC on success, or ParseError. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::expected +parseBluetoothConnectJson(std::string_view json); + +/** + * @brief parseBluetoothConnectRequest — mac, optional name, save flag. + * + * @dname parseBluetoothConnectRequest + * @param json POST /api/bluetooth/connect body. + * @return Parsed connect request (mac may be empty if invalid). + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] BluetoothConnectRequest parseBluetoothConnectRequest( + std::string_view json); + +/** + * @brief serializeBluetoothSpeakerJson — saved default speaker for HTTP. + * + * @dname serializeBluetoothSpeakerJson + * @param target Stored speaker, or nullptr when not configured. + * @return JSON object with configured flag. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string serializeBluetoothSpeakerJson( + const BtSpeakerTarget* target); + +/** + * @brief parseBluetoothSpeakerJson — validate POST /api/bluetooth/speaker. + * + * @dname parseBluetoothSpeakerJson + * @param json Request body with mac and optional name. + * @return BtSpeakerTarget on success, or ParseError. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::expected +parseBluetoothSpeakerJson(std::string_view json); + } // namespace core diff --git a/Software/components/core/include/core/Bt1035At.hpp b/Software/components/core/include/core/Bt1035At.hpp index 9d6606e..1e63175 100644 --- a/Software/components/core/include/core/Bt1035At.hpp +++ b/Software/components/core/include/core/Bt1035At.hpp @@ -13,6 +13,7 @@ #pragma once #include "core/Bt1035PairedDevice.hpp" +#include "core/Bt1035ScannedDevice.hpp" #include "core/ParseError.hpp" #include @@ -36,12 +37,14 @@ namespace core { * @date 2026-07-06 */ enum class Bt1035AtCommand { + Reset, ///< AT+RESET — software reset (best-effort, not gated on OK). Ping, ///< AT — link check. I2sMode, ///< AT+AUXCFG=3 — I2S input from ADAU1701 (mandatory). - I2sSlave48k32, ///< AT+I2SCFG=67 — I2S slave 48 kHz 32-bit (§5.1.4). + I2sSlave48k24, ///< AT+I2SCFG=35 — I2S slave 48 kHz 24-bit (§5.1.4). PairDiscoverable, ///< AT+PAIR=1 — enter BR/EDR/BLE discoverable mode. PairHidden, ///< AT+PAIR=0 — leave discoverable mode. A2dpStat, ///< AT+A2DPSTAT — read A2DP link state. + A2dpEncoder, ///< AT+A2DPENC — read negotiated A2DP codec (§5.3.5). A2dpDisconnect, ///< AT+A2DPDISC — release current A2DP connection. QueryName, ///< AT+NAME — read BR/EDR local name (+NAME=). QueryAutoConn, ///< AT+AUTOCONN — read power-on auto-reconnect count. @@ -67,6 +70,24 @@ enum class Bt1035A2dpState : std::uint8_t { Paused = 5, }; +/** + * @brief Bt1035A2dpCodec — negotiated codec from +A2DPENC=Param (§5.3.5). + * + * @dname Bt1035A2dpCodec + * @return n/a (type) + * @pubstate BT1035 chip variant codes (BT806 differs; board uses BT1035). + * + * @author Michele Bigi + * @date 2026-08-07 + */ +enum class Bt1035A2dpCodec : std::uint8_t { + Sbc = 1, + Aptx = 2, + AptxHd = 3, + AptxLl = 4, + AptxAdaptive = 5, +}; + /** * @brief Bt1035AtResponseKind — parsed module reply class. * @@ -86,8 +107,14 @@ enum class Bt1035AtResponseKind { /** Number of commands in bootInitSequence(). */ inline constexpr std::size_t kBt1035BootInitCommandCount = 3U; -/** Feasycom programming guide §5.1.4: I2S slave, 48 kHz, 32-bit. */ -inline constexpr std::uint8_t kBt1035I2sSlave48k32Param = 67U; +/** + * Feasycom programming guide §5.1.4: I2S slave, 48 kHz, 24-bit — matches the + * ADAU1701 serial output word length (SigmaStudio Hardware Configuration). + * Bit field: BIT[0]=enable(1), BIT[1]=slave(1), BIT[2]=FS 48kHz(0), + * BIT[3]=left justified(0), BIT[4]=data 1-bit delay(0), BIT[5:6]=24-bit(01) + * -> 1 + 2 + 32 = 35. + */ +inline constexpr std::uint8_t kBt1035I2sSlave48k24Param = 35U; /** * @brief buildBt1035AtLine — serialise a command with CRLF terminator. @@ -106,7 +133,7 @@ inline constexpr std::uint8_t kBt1035I2sSlave48k32Param = 67U; * @brief bootInitSequence — mandatory bring-up commands in order. * * @dname bootInitSequence - * @return Ping, I2sMode (AUXCFG=3), I2sSlave48k32 (I2SCFG=67). + * @return Ping, I2sMode (AUXCFG=3), I2sSlave48k24 (I2SCFG=35). * @pubstate none * * @author Michele Bigi @@ -156,6 +183,33 @@ parseBt1035A2dpStatResponse(std::string_view response); */ [[nodiscard]] const char* a2dpStateToken(Bt1035A2dpState state) noexcept; +/** + * @brief parseBt1035A2dpEncoderResponse — extract negotiated codec. + * + * @dname parseBt1035A2dpEncoderResponse + * @param response Full module reply (may include +A2DPENC and OK lines). + * @return Bt1035A2dpCodec on success, or ParseError::MissingField. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-07 + */ +[[nodiscard]] std::expected +parseBt1035A2dpEncoderResponse(std::string_view response); + +/** + * @brief a2dpCodecToken — serialise negotiated codec for logs/JSON. + * + * @dname a2dpCodecToken + * @param codec Parsed negotiated codec. + * @return Short stable string (e.g. "sbc"). + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-07 + */ +[[nodiscard]] const char* a2dpCodecToken(Bt1035A2dpCodec codec) noexcept; + /** * @brief buildBt1035SetAutoConnLine — AT+AUTOCONN with reconnect count. * @@ -226,4 +280,149 @@ parseBt1035AutoConnResponse(std::string_view response); [[nodiscard]] std::expected, ParseError> parseBt1035PairedListResponse(std::string_view response); +/** + * @brief buildBt1035StartScanLine — AT+SCAN for nearby BR/EDR devices. + * + * @dname buildBt1035StartScanLine + * @param scanType AT+SCAN Param1; clamped to 1 or 2 (2 only when + * passed exactly, otherwise 1). + * @param scanSeconds BR/EDR inquiry time 1–255 (Feasycom Param2). + * @return Full AT line including CRLF. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string buildBt1035StartScanLine(std::uint8_t scanType, + std::uint8_t scanSeconds = 0U); + +/** + * @brief buildBt1035StopScanLine — stop an active device scan. + * + * @dname buildBt1035StopScanLine + * @return AT+SCAN=0 line with CRLF. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string buildBt1035StopScanLine(); + +/** + * @brief buildBt1035EnablePrintLine — ensure +SCAN events are reported. + * + * @dname buildBt1035EnablePrintLine + * @return AT+PRINT=1 line with CRLF. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string buildBt1035EnablePrintLine(); + +/** + * @brief buildBt1035DisconnectAllLine — release all BT connections. + * + * @dname buildBt1035DisconnectAllLine + * @return AT+DSCA line with CRLF. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string buildBt1035DisconnectAllLine(); + +/** + * @brief buildBt1035DisableAutoLinkLine — disable auto-link on power-up. + * + * @dname buildBt1035DisableAutoLinkLine + * @return AT+LINKCFG=0,0 line with CRLF. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string buildBt1035DisableAutoLinkLine(); + +/** + * @brief buildBt1035ClearPairedListLine — erase all paired records. + * + * @dname buildBt1035ClearPairedListLine + * @return AT+PLIST=0 line with CRLF. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string buildBt1035ClearPairedListLine(); + +/** + * @brief buildBt1035A2dpConnectLine — connect A2DP to a remote MAC. + * + * @dname buildBt1035A2dpConnectLine + * @param mac 12-char ASCII MAC address (no colons). + * @return AT+A2DPCONN line, or empty when mac invalid. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string buildBt1035A2dpConnectLine(std::string_view mac); + +/** + * @brief buildBt1035A2dpAudioLine — start/stop A2DP audio (§5.3.6). + * + * @dname buildBt1035A2dpAudioLine + * @param establish true → AT+A2DPAUDIO=1, false → release audio. + * @return Full AT line including CRLF. + * @pubstate none + * + * Feasycom BT1035: link state Connected (3) is not enough for I2S→sink + * playback; audio starts after A2DPAUDIO=1 and +A2DPSTAT=4 (Streaming). + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string buildBt1035A2dpAudioLine(bool establish); + +/** + * @brief isValidBt1035Mac — true for 12 hex digits. + * + * @dname isValidBt1035Mac + * @param mac Candidate MAC from scan or UI. + * @return true when exactly 12 hexadecimal characters. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] bool isValidBt1035Mac(std::string_view mac) noexcept; + +/** + * @brief normalizeBt1035Mac — strip separators and uppercase MAC. + * + * @dname normalizeBt1035Mac + * @param mac MAC with optional colons or dashes. + * @return 12 uppercase hex digits, or empty when invalid length/chars. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string normalizeBt1035Mac(std::string_view mac); + +/** + * @brief parseBt1035ScanResponse — parse +SCAN= inquiry results. + * + * @dname parseBt1035ScanResponse + * @param response Full UART payload until +SCAN=E. + * @return Discovered devices, or ParseError when payload malformed. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::expected, ParseError> +parseBt1035ScanResponse(std::string_view response); + } // namespace core diff --git a/Software/components/core/include/core/Bt1035ScannedDevice.hpp b/Software/components/core/include/core/Bt1035ScannedDevice.hpp new file mode 100644 index 0000000..68d3c4a --- /dev/null +++ b/Software/components/core/include/core/Bt1035ScannedDevice.hpp @@ -0,0 +1,39 @@ +/** + * @file Bt1035ScannedDevice.hpp + * @brief One entry from FSC-BT1035 AT+SCAN (+SCAN= lines). + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-08-05 + */ +#pragma once + +#include +#include + +namespace core { + +/** + * @brief Bt1035ScannedDevice — nearby remote from +SCAN= events. + * + * @dname Bt1035ScannedDevice + * @return n/a (type) + * @pubstate Plain DTO parsed in the pure core. + * + * @author Michele Bigi + * @date 2026-08-05 + */ +struct Bt1035ScannedDevice { + std::uint8_t index; ///< Scan result index from the module. + std::uint8_t addressType; ///< 0/1 LE, 2 BR/EDR (Feasycom manual). + std::string mac; ///< 12-char ASCII MAC without separators. + std::int16_t rssiDbm; ///< RSSI in dBm (-127..-1). + std::string name; ///< Remote friendly name when advertised. + std::string deviceClass; ///< Class of device hex string when present. +}; + +} // namespace core diff --git a/Software/components/core/include/core/BtSpeakerTarget.hpp b/Software/components/core/include/core/BtSpeakerTarget.hpp new file mode 100644 index 0000000..1d5340f --- /dev/null +++ b/Software/components/core/include/core/BtSpeakerTarget.hpp @@ -0,0 +1,34 @@ +/** + * @file BtSpeakerTarget.hpp + * @brief Saved A2DP speaker target (MAC + optional friendly name). + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-08-05 + */ +#pragma once + +#include + +namespace core { + +/** + * @brief BtSpeakerTarget — default BR/EDR speaker for AT+A2DPCONN. + * + * @dname BtSpeakerTarget + * @return n/a (type) + * @pubstate Persisted in NVS via ISecureStore; MAC is 12-char ASCII hex. + * + * @author Michele Bigi + * @date 2026-08-05 + */ +struct BtSpeakerTarget { + std::string mac; ///< 12-char BR/EDR MAC (uppercase, no separators). + std::string name; ///< Optional label shown in the web UI. +}; + +} // namespace core diff --git a/Software/components/core/include/core/CompanionChipStatus.hpp b/Software/components/core/include/core/CompanionChipStatus.hpp index f3fc396..e8c3296 100644 --- a/Software/components/core/include/core/CompanionChipStatus.hpp +++ b/Software/components/core/include/core/CompanionChipStatus.hpp @@ -27,7 +27,7 @@ namespace core { struct CompanionChipStatus { bool si4684Ready; ///< Si4684 HOST_LOAD completed. bool adau1701Ready; ///< ADAU1701 SigmaStudio download completed. - bool bt1035Ready; ///< BT1035 I2S init (AUXCFG=3 + I2SCFG=67) completed. + bool bt1035Ready; ///< BT1035 I2S init (AUXCFG=3 + I2SCFG=35) completed. }; } // namespace core diff --git a/Software/components/core/include/core/IDsp.hpp b/Software/components/core/include/core/IDsp.hpp index 33c7d4f..a48b774 100644 --- a/Software/components/core/include/core/IDsp.hpp +++ b/Software/components/core/include/core/IDsp.hpp @@ -130,6 +130,21 @@ public: */ [[nodiscard]] virtual std::expected setEqBand( EqBandIndex band, GainDb gain, FrequencyHz center, float q) = 0; + + /** + * @brief setBeepEnabled — gate the SigmaStudio Beep1 tone generator. + * + * @dname setBeepEnabled + * @param enabled true unmutes Beep1, false mutes it. + * @return Ok on success, or DspError. + * @pubstate writes ADAU1701 parameter RAM via safeload. Not part of + * AudioProfile — live-only, never persisted. + * + * @author Michele Bigi + * @date 2026-08-07 + */ + [[nodiscard]] virtual std::expected setBeepEnabled( + bool enabled) = 0; }; } // namespace core diff --git a/Software/components/core/include/core/ISecureStore.hpp b/Software/components/core/include/core/ISecureStore.hpp index 489f5df..95effbe 100644 --- a/Software/components/core/include/core/ISecureStore.hpp +++ b/Software/components/core/include/core/ISecureStore.hpp @@ -18,6 +18,7 @@ #pragma once #include "core/StoreError.hpp" +#include "core/BtSpeakerTarget.hpp" #include "core/WifiCredentials.hpp" #include @@ -210,6 +211,97 @@ public: */ [[nodiscard]] virtual std::expected clearLastPresetIndex() = 0; + + /** + * @brief hasBtSpeakerTarget — check whether a default speaker MAC is stored. + * + * @dname hasBtSpeakerTarget + * @return true when loadBtSpeakerTarget would succeed. + * @pubstate reads backing storage via implementation. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] virtual bool hasBtSpeakerTarget() const = 0; + + /** + * @brief saveBtSpeakerTarget — persist default A2DP speaker MAC/name. + * + * @dname saveBtSpeakerTarget + * @param target Validated MAC and optional display name. + * @return Ok on success, or StoreError::IoFailed. + * @pubstate writes backing storage via implementation. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] virtual std::expected + saveBtSpeakerTarget(const BtSpeakerTarget& target) = 0; + + /** + * @brief loadBtSpeakerTarget — read stored default speaker. + * + * @dname loadBtSpeakerTarget + * @return BtSpeakerTarget on success, or StoreError. + * @pubstate reads backing storage via implementation. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] virtual std::expected + loadBtSpeakerTarget() const = 0; + + /** + * @brief clearBtSpeakerTarget — erase stored default speaker. + * + * @dname clearBtSpeakerTarget + * @return Ok on success, or StoreError::IoFailed. + * @pubstate clears backing storage via implementation. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] virtual std::expected + clearBtSpeakerTarget() = 0; + + /** + * @brief hasWebRadioConfig — check whether a streaming config is stored. + * + * @dname hasWebRadioConfig + * @return true when loadWebRadioConfigJson would succeed. + * @pubstate reads backing storage via implementation. + * + * @author Michele Bigi + * @date 2026-08-08 + */ + [[nodiscard]] virtual bool hasWebRadioConfig() const = 0; + + /** + * @brief saveWebRadioConfigJson — persist serialised streaming config. + * + * @dname saveWebRadioConfigJson + * @param json Output of core::serializeWebRadioConfigJson(). + * @return Ok on success, or StoreError::IoFailed. + * @pubstate writes backing storage via implementation. + * + * @author Michele Bigi + * @date 2026-08-08 + */ + [[nodiscard]] virtual std::expected + saveWebRadioConfigJson(std::string_view json) = 0; + + /** + * @brief loadWebRadioConfigJson — read stored streaming config. + * + * @dname loadWebRadioConfigJson + * @return JSON blob on success, or StoreError. + * @pubstate reads backing storage via implementation. + * + * @author Michele Bigi + * @date 2026-08-08 + */ + [[nodiscard]] virtual std::expected + loadWebRadioConfigJson() const = 0; }; } // namespace core diff --git a/Software/components/core/include/core/MixerState.hpp b/Software/components/core/include/core/MixerState.hpp index 8a9449b..1f8948b 100644 --- a/Software/components/core/include/core/MixerState.hpp +++ b/Software/components/core/include/core/MixerState.hpp @@ -33,11 +33,11 @@ struct MixerState { GainDb si4684Right; ///< Si4674 volume control, right channel. GainDb esp32Left; ///< ESP32 volume control, left channel. GainDb esp32Right; ///< ESP32 volume control, right channel. - GainDb mixLeft; ///< St Mixer1 left blend level. - GainDb mixRight; ///< St Mixer1 right blend level. + GainDb mixLeft; ///< St Mixer1 ST0 (Si4684) input level. + GainDb mixRight; ///< St Mixer1 ST1 (ESP32) input level. /** - * @brief factoryDefault — unity gains on all paths (radio-first mix). + * @brief factoryDefault — unity gains on all paths. * * @dname factoryDefault * @return MixerState with 0 dB on every control. @@ -47,6 +47,18 @@ struct MixerState { * @date 2026-07-06 */ [[nodiscard]] static MixerState factoryDefault() noexcept; + + /** + * @brief radioFirst — Si4684 path open, ESP32 path muted. + * + * @dname radioFirst + * @return MixerState for FM/DAB tuner audio to the Bose I2S chain. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] static MixerState radioFirst() noexcept; }; } // namespace core diff --git a/Software/components/core/include/core/TunerJson.hpp b/Software/components/core/include/core/TunerJson.hpp index 1ede01f..511d89a 100644 --- a/Software/components/core/include/core/TunerJson.hpp +++ b/Software/components/core/include/core/TunerJson.hpp @@ -58,6 +58,43 @@ struct TunerPlayRequest { std::uint32_t componentId; ///< Audio component within the service. }; +/** + * @brief TunerScanRequest — parsed POST /api/tuner/scan body. + * + * @dname TunerScanRequest + * @return n/a (type) + * @pubstate Plain DTO filled by parseTunerScanJson at the HTTP boundary. + * + * @author Michele Bigi + * @date 2026-08-05 + */ +struct TunerScanRequest { + TunerBand band; ///< FM seek scan or DAB ensemble scan. + std::uint8_t maxSteps; ///< Max FM seeks or DAB ensemble indices to try. + std::string nameFilter; ///< Optional case-insensitive substring (PS/DAB label). +}; + +/** + * @brief TunerScanResult — outcome of an automatic station search. + * + * @dname TunerScanResult + * @return n/a (type) + * @pubstate Built by TunerService::scanForStation(). + * + * @author Michele Bigi + * @date 2026-08-05 + */ +struct TunerScanResult { + bool found; ///< True when a station matched criteria. + TunerBand band; ///< Band that was scanned. + std::uint16_t stepsTried; ///< Seek or ensemble attempts performed. + std::optional fmFrequency; ///< FM centre when found on FM. + std::optional dabFreqIndex; ///< Ensemble index when found on DAB. + std::optional dabServiceId; ///< Started DAB service id. + std::optional dabComponentId; ///< Started DAB component id. + std::optional stationName; ///< RDS PS or DAB label when known. +}; + /** * @brief serializeTunerStatusJson — serialise a tuner snapshot for GET status. * @@ -143,4 +180,31 @@ struct TunerPlayRequest { [[nodiscard]] std::expected parseTunerSeekJson( std::string_view json); +/** + * @brief parseTunerScanJson — validate POST /api/tuner/scan body. + * + * @dname parseTunerScanJson + * @param json Untrusted request body from the HTTP handler. + * @return TunerScanRequest on success, or a ParseError. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::expected parseTunerScanJson( + std::string_view json); + +/** + * @brief serializeTunerScanJson — serialise automatic scan outcome. + * + * @dname serializeTunerScanJson + * @param result Scan result from TunerService::scanForStation(). + * @return JSON object for the HTTP response body. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string serializeTunerScanJson(const TunerScanResult& result); + } // namespace core diff --git a/Software/components/core/include/core/TunerStatus.hpp b/Software/components/core/include/core/TunerStatus.hpp index 6ddab37..f93963d 100644 --- a/Software/components/core/include/core/TunerStatus.hpp +++ b/Software/components/core/include/core/TunerStatus.hpp @@ -60,6 +60,7 @@ struct TunerStatus { std::optional dabPlayingServiceId; ///< Last played DAB service. std::optional dabPlayingComponentId; ///< Last played DAB component. std::optional fmFrequency; ///< Tuned FM centre frequency. + std::optional fmChipReadFrequency; ///< FM_RSQ READFREQ (may lag commanded). std::optional fmRssiDbuV; ///< FM RSSI in dBµV. std::optional fmSnrDb; ///< FM SNR in dB. std::optional fmStereo; ///< FM stereo pilot detected. diff --git a/Software/components/core/include/core/WebRadioConfig.hpp b/Software/components/core/include/core/WebRadioConfig.hpp new file mode 100644 index 0000000..9996a9e --- /dev/null +++ b/Software/components/core/include/core/WebRadioConfig.hpp @@ -0,0 +1,52 @@ +/** + * @file WebRadioConfig.hpp + * @brief Internet radio stream configuration (URL + enable flag). + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-08-08 + */ +#pragma once + +#include + +namespace core { + +/** + * @brief WebRadioConfig — HTTP MP3 stream URL and on/off state. + * + * @dname WebRadioConfig + * @return n/a (type) + * @pubstate Plain value type; url is a plaintext http:// URL (no secrets). + * + * @author Michele Bigi + * @date 2026-08-08 + */ +struct WebRadioConfig { + bool enabled = false; ///< Whether the streaming task should be playing. + std::string url; ///< Plaintext http:// MP3 stream URL. + + /** + * @brief factoryDefault — disabled, with a known-good sample URL. + * + * @dname factoryDefault + * @return WebRadioConfig with enabled=false and a placeholder URL. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-08 + */ + [[nodiscard]] static WebRadioConfig factoryDefault() + { + return WebRadioConfig{ + .enabled = false, + .url = "http://edge.radiomontecarlo.net/RMC.mp3", + }; + } +}; + +} // namespace core diff --git a/Software/components/core/include/core/WebRadioJson.hpp b/Software/components/core/include/core/WebRadioJson.hpp new file mode 100644 index 0000000..9676cc7 --- /dev/null +++ b/Software/components/core/include/core/WebRadioJson.hpp @@ -0,0 +1,66 @@ +/** + * @file WebRadioJson.hpp + * @brief JSON parse/serialise for the web radio streaming API (pure core). + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-08-08 + */ +#pragma once + +#include "core/ParseError.hpp" +#include "core/WebRadioConfig.hpp" + +#include +#include +#include + +namespace core { + +/** + * @brief parseWebRadioConfigJson — parse POST /api/streaming body. + * + * @dname parseWebRadioConfigJson + * @param json Untrusted request body: {"enabled":bool,"url":string}. + * @return WebRadioConfig on success, or ParseError. Rejects URLs that + * are missing, longer than 200 bytes, or not http://. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-08 + */ +[[nodiscard]] std::expected parseWebRadioConfigJson( + std::string_view json); + +/** + * @brief serializeWebRadioConfigJson — serialise for GET /api/streaming. + * + * @dname serializeWebRadioConfigJson + * @param config Current streaming configuration. + * @return JSON object string for the HTTP response body. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-08 + */ +[[nodiscard]] std::string serializeWebRadioConfigJson( + const WebRadioConfig& config); + +/** + * @brief serializeWebRadioErrorJson — error response for streaming routes. + * + * @dname serializeWebRadioErrorJson + * @param reason Safe token (never includes secrets). + * @return JSON object with status and reason fields. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-08 + */ +[[nodiscard]] std::string serializeWebRadioErrorJson(std::string_view reason); + +} // namespace core diff --git a/Software/components/core/include/core/WifiScanJson.hpp b/Software/components/core/include/core/WifiScanJson.hpp new file mode 100644 index 0000000..54815b3 --- /dev/null +++ b/Software/components/core/include/core/WifiScanJson.hpp @@ -0,0 +1,50 @@ +/** + * @file WifiScanJson.hpp + * @brief JSON serialisation for Wi-Fi scan REST API (pure core). + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-08-05 + */ +#pragma once + +#include "core/WifiScannedNetwork.hpp" + +#include +#include +#include + +namespace core { + +/** + * @brief serializeWifiScanJson — serialise scan result list. + * + * @dname serializeWifiScanJson + * @param networks Deduped AP records sorted by signal strength. + * @return JSON object with a networks array. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string serializeWifiScanJson( + const std::vector& networks); + +/** + * @brief serializeWifiScanErrorJson — serialise a Wi-Fi scan API error. + * + * @dname serializeWifiScanErrorJson + * @param reason Short machine-readable cause. + * @return JSON error object. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string serializeWifiScanErrorJson(std::string_view reason); + +} // namespace core diff --git a/Software/components/core/include/core/WifiScannedNetwork.hpp b/Software/components/core/include/core/WifiScannedNetwork.hpp new file mode 100644 index 0000000..9cb133d --- /dev/null +++ b/Software/components/core/include/core/WifiScannedNetwork.hpp @@ -0,0 +1,37 @@ +/** + * @file WifiScannedNetwork.hpp + * @brief One entry from a nearby Wi-Fi access-point scan. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-08-05 + */ +#pragma once + +#include +#include + +namespace core { + +/** + * @brief WifiScannedNetwork — nearby AP from a Wi-Fi scan. + * + * @dname WifiScannedNetwork + * @return n/a (type) + * @pubstate Plain DTO assembled by the net shell after esp_wifi scan. + * + * @author Michele Bigi + * @date 2026-08-05 + */ +struct WifiScannedNetwork { + std::string ssid; ///< Broadcast SSID (may be empty when hidden). + std::int16_t rssiDbm; ///< RSSI in dBm. + std::string auth; ///< Short auth token (open, wpa2, wpa3, …). + std::uint8_t channel; ///< Primary channel number. +}; + +} // namespace core diff --git a/Software/components/core/src/AudioProfileJson.cpp b/Software/components/core/src/AudioProfileJson.cpp index e9de512..3edcb72 100644 --- a/Software/components/core/src/AudioProfileJson.cpp +++ b/Software/components/core/src/AudioProfileJson.cpp @@ -54,6 +54,25 @@ namespace { return end != json.data() + valueStart; } +[[nodiscard]] bool extractJsonBool(std::string_view json, + std::string_view key, + bool& out) +{ + const std::string trueNeedle = + std::string("\"") + std::string(key) + "\":true"; + const std::string falseNeedle = + std::string("\"") + std::string(key) + "\":false"; + if (json.find(trueNeedle) != std::string_view::npos) { + out = true; + return true; + } + if (json.find(falseNeedle) != std::string_view::npos) { + out = false; + return true; + } + return false; +} + [[nodiscard]] std::expected parseGainField( std::string_view json, std::string_view key) { @@ -277,4 +296,17 @@ std::expected parseEnhanceLevelJson( return EnhanceLevel::tryFromLevel(level); } +std::expected parseBeepEnabledJson(std::string_view json) +{ + if (json.find('{') == std::string_view::npos) { + return std::unexpected(ParseError::InvalidJson); + } + + bool enabled = false; + if (!extractJsonBool(json, "enabled", enabled)) { + return std::unexpected(ParseError::MissingField); + } + return enabled; +} + } // namespace core diff --git a/Software/components/core/src/BluetoothJson.cpp b/Software/components/core/src/BluetoothJson.cpp index ff97b04..1722f94 100644 --- a/Software/components/core/src/BluetoothJson.cpp +++ b/Software/components/core/src/BluetoothJson.cpp @@ -14,6 +14,7 @@ #include "core/BluetoothJson.hpp" #include +#include #include namespace core { @@ -95,4 +96,112 @@ parseBluetoothAutoReconnectJson(std::string_view json) return static_cast(raw); } +std::string serializeBluetoothScanJson( + const std::vector& devices) +{ + std::ostringstream out; + out << "{\"devices\":["; + for (std::size_t i = 0; i < devices.size(); ++i) { + if (i > 0U) { + out << ','; + } + const Bt1035ScannedDevice& device = devices[i]; + out << "{\"index\":" << static_cast(device.index) + << ",\"mac\":"; + appendJsonString(out, device.mac); + out << ",\"name\":"; + appendJsonString(out, device.name); + out << ",\"rssi_dbm\":" << device.rssiDbm << "}"; + } + out << "]}"; + return out.str(); +} + +std::expected +parseBluetoothConnectJson(std::string_view json) +{ + if (json.find('{') == std::string_view::npos) { + return std::unexpected(ParseError::InvalidJson); + } + const std::string needle = "\"mac\":\""; + const std::size_t start = json.find(needle); + if (start == std::string_view::npos) { + return std::unexpected(ParseError::MissingField); + } + const std::size_t valueStart = start + needle.size(); + const std::size_t valueEnd = json.find('"', valueStart); + if (valueEnd == std::string_view::npos) { + return std::unexpected(ParseError::InvalidJson); + } + const std::string_view mac = json.substr(valueStart, valueEnd - valueStart); + if (!isValidBt1035Mac(mac)) { + return std::unexpected(ParseError::InvalidJson); + } + std::string normalized; + normalized.reserve(12U); + for (const char ch : mac) { + normalized.push_back( + static_cast(std::toupper(static_cast(ch)))); + } + return normalized; +} + +BluetoothConnectRequest parseBluetoothConnectRequest(std::string_view json) +{ + BluetoothConnectRequest request{ + .mac = {}, + .name = {}, + .save = false, + }; + if (auto mac = parseBluetoothConnectJson(json); mac) { + request.mac = std::move(*mac); + } + const std::string nameNeedle = "\"name\":\""; + const std::size_t nameStart = json.find(nameNeedle); + if (nameStart != std::string_view::npos) { + const std::size_t valueStart = nameStart + nameNeedle.size(); + const std::size_t valueEnd = json.find('"', valueStart); + if (valueEnd != std::string_view::npos) { + request.name.assign(json.substr(valueStart, valueEnd - valueStart)); + } + } + request.save = json.find("\"save\":true") != std::string_view::npos + || json.find("\"save\": true") != std::string_view::npos; + return request; +} + +std::string serializeBluetoothSpeakerJson(const BtSpeakerTarget* target) +{ + if (target == nullptr) { + return "{\"configured\":false}"; + } + std::ostringstream out; + out << "{\"configured\":true,\"mac\":"; + appendJsonString(out, target->mac); + out << ",\"name\":"; + appendJsonString(out, target->name); + out << '}'; + return out.str(); +} + +std::expected +parseBluetoothSpeakerJson(std::string_view json) +{ + const auto mac = parseBluetoothConnectJson(json); + if (!mac) { + return std::unexpected(mac.error()); + } + BtSpeakerTarget target{.mac = *mac, .name = {}}; + const std::string nameNeedle = "\"name\":\""; + const std::size_t nameStart = json.find(nameNeedle); + if (nameStart != std::string_view::npos) { + const std::size_t valueStart = nameStart + nameNeedle.size(); + const std::size_t valueEnd = json.find('"', valueStart); + if (valueEnd != std::string_view::npos) { + target.name.assign(json.substr(valueStart, valueEnd - valueStart)); + } + } + return target; +} + } // namespace core diff --git a/Software/components/core/src/Bt1035At.cpp b/Software/components/core/src/Bt1035At.cpp index 8af6881..2121052 100644 --- a/Software/components/core/src/Bt1035At.cpp +++ b/Software/components/core/src/Bt1035At.cpp @@ -13,6 +13,7 @@ #include "core/Bt1035At.hpp" +#include #include #include @@ -99,18 +100,22 @@ namespace { std::string buildBt1035AtLine(Bt1035AtCommand command) { switch (command) { + case Bt1035AtCommand::Reset: + return "AT+RESET\r\n"; case Bt1035AtCommand::Ping: return "AT\r\n"; case Bt1035AtCommand::I2sMode: return "AT+AUXCFG=3\r\n"; - case Bt1035AtCommand::I2sSlave48k32: - return "AT+I2SCFG=67\r\n"; + case Bt1035AtCommand::I2sSlave48k24: + return "AT+I2SCFG=35\r\n"; case Bt1035AtCommand::PairDiscoverable: return "AT+PAIR=1\r\n"; case Bt1035AtCommand::PairHidden: return "AT+PAIR=0\r\n"; case Bt1035AtCommand::A2dpStat: return "AT+A2DPSTAT\r\n"; + case Bt1035AtCommand::A2dpEncoder: + return "AT+A2DPENC\r\n"; case Bt1035AtCommand::A2dpDisconnect: return "AT+A2DPDISC\r\n"; case Bt1035AtCommand::QueryName: @@ -145,7 +150,7 @@ std::array bootInitSequence() noex return std::array{ Bt1035AtCommand::Ping, Bt1035AtCommand::I2sMode, - Bt1035AtCommand::I2sSlave48k32, + Bt1035AtCommand::I2sSlave48k24, }; } @@ -206,6 +211,43 @@ const char* a2dpStateToken(Bt1035A2dpState state) noexcept return "unknown"; } +std::expected +parseBt1035A2dpEncoderResponse(std::string_view response) +{ + constexpr std::string_view kPrefix = "+A2DPENC="; + const std::size_t pos = response.find(kPrefix); + if (pos == std::string_view::npos) { + return std::unexpected(ParseError::MissingField); + } + + const std::size_t valueStart = pos + kPrefix.size(); + char* end = nullptr; + const unsigned long raw = + std::strtoul(response.data() + valueStart, &end, 10); + if (end == response.data() + valueStart || raw < 1U || raw > 5U) { + return std::unexpected(ParseError::MissingField); + } + + return static_cast(raw); +} + +const char* a2dpCodecToken(Bt1035A2dpCodec codec) noexcept +{ + switch (codec) { + case Bt1035A2dpCodec::Sbc: + return "sbc"; + case Bt1035A2dpCodec::Aptx: + return "aptx"; + case Bt1035A2dpCodec::AptxHd: + return "aptx-hd"; + case Bt1035A2dpCodec::AptxLl: + return "aptx-ll"; + case Bt1035A2dpCodec::AptxAdaptive: + return "aptx-adaptive"; + } + return "unknown"; +} + std::expected parseBt1035NameResponse(std::string_view response) { @@ -286,4 +328,179 @@ parseBt1035PairedListResponse(std::string_view response) return devices; } +std::string buildBt1035StartScanLine(std::uint8_t scanType, std::uint8_t scanSeconds) +{ + const std::uint8_t type = (scanType == 2U) ? 2U : 1U; + if (scanSeconds == 0U) { + return "AT+SCAN=" + std::to_string(type) + "\r\n"; + } + return "AT+SCAN=" + std::to_string(type) + "," + + std::to_string(scanSeconds) + "\r\n"; +} + +std::string buildBt1035StopScanLine() +{ + return "AT+SCAN=0\r\n"; +} + +std::string buildBt1035EnablePrintLine() +{ + return "AT+PRINT=1\r\n"; +} + +std::string buildBt1035DisconnectAllLine() +{ + return "AT+DSCA\r\n"; +} + +std::string buildBt1035DisableAutoLinkLine() +{ + return "AT+LINKCFG=0,0\r\n"; +} + +std::string buildBt1035ClearPairedListLine() +{ + return "AT+PLIST=0\r\n"; +} + +bool isValidBt1035Mac(std::string_view mac) noexcept +{ + if (mac.size() != 12U) { + return false; + } + for (const char ch : mac) { + if (!std::isxdigit(static_cast(ch))) { + return false; + } + } + return true; +} + +[[nodiscard]] std::string normalizeBt1035Mac(std::string_view mac) +{ + std::string normalized; + normalized.reserve(12U); + for (const char ch : mac) { + if (ch == ':' || ch == '-') { + continue; + } + normalized.push_back( + static_cast(std::toupper(static_cast(ch)))); + } + return normalized; +} + +std::string buildBt1035A2dpConnectLine(std::string_view mac) +{ + if (!isValidBt1035Mac(mac)) { + return {}; + } + return std::string("AT+A2DPCONN=") + std::string(mac) + "\r\n"; +} + +std::string buildBt1035A2dpAudioLine(bool establish) +{ + return establish ? "AT+A2DPAUDIO=1\r\n" : "AT+A2DPAUDIO=0\r\n"; +} + +std::expected, ParseError> +parseBt1035ScanResponse(std::string_view response) +{ + std::vector devices; + std::size_t pos = 0; + while ((pos = response.find("+SCAN", pos)) != std::string_view::npos) { + std::size_t start = pos + 5U; + if (start < response.size() && response[start] == '=') { + ++start; + } + while (start < response.size() + && (response[start] == ' ' || response[start] == '\t')) { + ++start; + } + const std::size_t end = response.find_first_of("\r\n", start); + const std::string_view line = + end == std::string_view::npos ? response.substr(start) + : response.substr(start, end - start); + pos = end == std::string_view::npos ? response.size() : end + 1U; + if (line.empty() || line == "E" || line.front() == 'E') { + continue; + } + + const std::string lineStr(line); + + const std::size_t comma1 = lineStr.find(','); + const std::size_t comma2 = + comma1 == std::string_view::npos ? std::string_view::npos + : lineStr.find(',', comma1 + 1U); + const std::size_t comma3 = + comma2 == std::string_view::npos ? std::string_view::npos + : lineStr.find(',', comma2 + 1U); + const std::size_t comma4 = + comma3 == std::string_view::npos ? std::string_view::npos + : lineStr.find(',', comma3 + 1U); + if (comma4 == std::string_view::npos) { + continue; + } + + char* endIdx = nullptr; + const unsigned long index = + std::strtoul(lineStr.c_str(), &endIdx, 10); + if (endIdx == lineStr.c_str() || index == 0U) { + continue; + } + + const unsigned long addrType = + std::strtoul(lineStr.c_str() + comma1 + 1U, &endIdx, 10); + const std::string mac = + normalizeBt1035Mac(lineStr.substr(comma2 + 1U, comma3 - comma2 - 1U)); + if (!isValidBt1035Mac(mac)) { + continue; + } + + const long rssi = + std::strtol(lineStr.c_str() + comma3 + 1U, &endIdx, 10); + const unsigned long nameLen = + std::strtoul(lineStr.c_str() + comma4 + 1U, &endIdx, 10); + const std::size_t afterNameLen = + static_cast(endIdx - lineStr.c_str()); + + std::string name; + std::string deviceClass; + if (nameLen > 0U) { + if (afterNameLen >= lineStr.size() || lineStr[afterNameLen] != ',') { + continue; + } + const std::size_t nameStart = afterNameLen + 1U; + if (nameStart + nameLen > lineStr.size()) { + continue; + } + name.assign(lineStr.substr(nameStart, nameLen)); + const std::size_t afterName = nameStart + nameLen; + if (afterName < lineStr.size() && lineStr[afterName] == ',') { + deviceClass.assign(lineStr.substr(afterName + 1U)); + } + } else if (afterNameLen < lineStr.size() + && lineStr[afterNameLen] == ',') { + const std::size_t classStart = afterNameLen + 1U; + if (classStart < lineStr.size()) { + if (lineStr[classStart] == ',') { + deviceClass.assign(lineStr.substr(classStart + 1U)); + } else { + deviceClass.assign(lineStr.substr(classStart)); + } + } + } + + Bt1035ScannedDevice entry = {}; + entry.index = static_cast(index); + entry.addressType = static_cast(addrType); + entry.mac = mac; + entry.rssiDbm = static_cast(rssi); + entry.name = std::move(name); + entry.deviceClass = std::move(deviceClass); + devices.push_back(std::move(entry)); + } + return devices; +} + } // namespace core diff --git a/Software/components/core/src/MixerState.cpp b/Software/components/core/src/MixerState.cpp index 37990e3..f766016 100644 --- a/Software/components/core/src/MixerState.cpp +++ b/Software/components/core/src/MixerState.cpp @@ -28,4 +28,18 @@ MixerState MixerState::factoryDefault() noexcept }; } +MixerState MixerState::radioFirst() noexcept +{ + const GainDb unity = GainDb::zero(); + const GainDb muted = *GainDb::tryFromDb(GainDb::kMinDb); + return MixerState{ + .si4684Left = unity, + .si4684Right = unity, + .esp32Left = muted, + .esp32Right = muted, + .mixLeft = unity, + .mixRight = muted, + }; +} + } // namespace core diff --git a/Software/components/core/src/TunerJson.cpp b/Software/components/core/src/TunerJson.cpp index 56266eb..5ca251d 100644 --- a/Software/components/core/src/TunerJson.cpp +++ b/Software/components/core/src/TunerJson.cpp @@ -246,4 +246,74 @@ std::expected parseTunerSeekJson( return std::unexpected(ParseError::InvalidJson); } +std::expected parseTunerScanJson( + std::string_view json) +{ + if (json.find('{') == std::string_view::npos) { + return std::unexpected(ParseError::InvalidJson); + } + + const std::string_view band = extractJsonString(json, "band"); + if (band.empty()) { + return std::unexpected(ParseError::MissingField); + } + + TunerScanRequest req = {}; + unsigned long maxSteps = 0U; + if (band == "fm") { + req.band = TunerBand::Fm; + req.maxSteps = 45U; + } else if (band == "dab") { + req.band = TunerBand::Dab; + req.maxSteps = 38U; + } else { + return std::unexpected(ParseError::InvalidJson); + } + + if (extractJsonUint(json, "max_steps", maxSteps)) { + if (maxSteps == 0U || maxSteps > 255U) { + return std::unexpected(ParseError::InvalidJson); + } + req.maxSteps = static_cast(maxSteps); + } + + const std::string_view name = extractJsonString(json, "name"); + if (!name.empty()) { + req.nameFilter.assign(name.begin(), name.end()); + for (char& ch : req.nameFilter) { + if (ch >= 'A' && ch <= 'Z') { + ch = static_cast(ch - 'A' + 'a'); + } + } + } + return req; +} + +std::string serializeTunerScanJson(const TunerScanResult& result) +{ + std::ostringstream out; + out << "{\"status\":\"" << (result.found ? "found" : "not_found") << '"' + << ",\"band\":\"" << bandToken(result.band) << '"' + << ",\"steps\":" << result.stepsTried; + + if (result.fmFrequency) { + out << ",\"frequency_khz\":" << result.fmFrequency->value(); + } + if (result.dabFreqIndex) { + out << ",\"freq_index\":" << static_cast(*result.dabFreqIndex); + } + if (result.dabServiceId) { + out << ",\"service_id\":" << *result.dabServiceId; + } + if (result.dabComponentId) { + out << ",\"component_id\":" << *result.dabComponentId; + } + if (result.stationName) { + out << ",\"station_name\":"; + appendJsonString(out, result.stationName->value()); + } + out << '}'; + return out.str(); +} + } // namespace core diff --git a/Software/components/core/src/WebRadioJson.cpp b/Software/components/core/src/WebRadioJson.cpp new file mode 100644 index 0000000..fee4b2f --- /dev/null +++ b/Software/components/core/src/WebRadioJson.cpp @@ -0,0 +1,89 @@ +/** + * @file WebRadioJson.cpp + * @brief WebRadioJson implementation. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-08-08 + */ + +#include "core/WebRadioJson.hpp" + +namespace core { + +namespace { + +constexpr std::size_t kMaxUrlLength = 200U; +constexpr std::string_view kHttpPrefix = "http://"; + +[[nodiscard]] std::string_view extractJsonString(std::string_view json, + std::string_view key) +{ + const std::string needle = + std::string("\"") + std::string(key) + "\":\""; + const std::size_t start = json.find(needle); + if (start == std::string_view::npos) { + return {}; + } + const std::size_t valueStart = start + needle.size(); + const std::size_t valueEnd = json.find('"', valueStart); + if (valueEnd == std::string_view::npos) { + return {}; + } + return json.substr(valueStart, valueEnd - valueStart); +} + +[[nodiscard]] bool extractJsonBool(std::string_view json, + std::string_view key, bool& out) +{ + const std::string trueNeedle = + std::string("\"") + std::string(key) + "\":true"; + const std::string falseNeedle = + std::string("\"") + std::string(key) + "\":false"; + if (json.find(trueNeedle) != std::string_view::npos) { + out = true; + return true; + } + if (json.find(falseNeedle) != std::string_view::npos) { + out = false; + return true; + } + return false; +} + +} // namespace + +std::expected parseWebRadioConfigJson( + std::string_view json) +{ + bool enabled = false; + if (!extractJsonBool(json, "enabled", enabled)) { + return std::unexpected(ParseError::MissingField); + } + + const std::string_view url = extractJsonString(json, "url"); + if (url.empty() || url.size() > kMaxUrlLength + || url.substr(0, kHttpPrefix.size()) != kHttpPrefix) { + return std::unexpected(ParseError::InvalidJson); + } + + return WebRadioConfig{.enabled = enabled, .url = std::string(url)}; +} + +std::string serializeWebRadioConfigJson(const WebRadioConfig& config) +{ + return std::string(R"({"enabled":)") + (config.enabled ? "true" : "false") + + R"(,"url":")" + config.url + "\"}"; +} + +std::string serializeWebRadioErrorJson(std::string_view reason) +{ + return std::string(R"({"status":"error","reason":")") + + std::string(reason) + "\"}"; +} + +} // namespace core diff --git a/Software/components/core/src/WifiScanJson.cpp b/Software/components/core/src/WifiScanJson.cpp new file mode 100644 index 0000000..cbaf350 --- /dev/null +++ b/Software/components/core/src/WifiScanJson.cpp @@ -0,0 +1,73 @@ +/** + * @file WifiScanJson.cpp + * @brief Wi-Fi scan JSON serialisation implementation. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-08-05 + */ + +#include "core/WifiScanJson.hpp" + +#include + +namespace core { + +namespace { + +/** + * @brief appendJsonString — emit a JSON string literal. + * + * @dname appendJsonString + * @param out Output stream. + * @param text Raw UTF-8 text. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +void appendJsonString(std::ostringstream& out, std::string_view text) +{ + out << '"'; + for (const char ch : text) { + if (ch == '"' || ch == '\\') { + out << '\\'; + } + out << ch; + } + out << '"'; +} + +} // namespace + +std::string serializeWifiScanJson( + const std::vector& networks) +{ + std::ostringstream out; + out << "{\"networks\":["; + for (std::size_t i = 0; i < networks.size(); ++i) { + if (i > 0U) { + out << ','; + } + const WifiScannedNetwork& network = networks[i]; + out << "{\"ssid\":"; + appendJsonString(out, network.ssid); + out << ",\"rssi_dbm\":" << network.rssiDbm << ",\"auth\":"; + appendJsonString(out, network.auth); + out << ",\"channel\":" << static_cast(network.channel) << '}'; + } + out << "]}"; + return out.str(); +} + +std::string serializeWifiScanErrorJson(std::string_view reason) +{ + return std::string("{\"status\":\"error\",\"reason\":\"") + std::string(reason) + + "\"}"; +} + +} // namespace core diff --git a/Software/components/core/test/CMakeLists.txt b/Software/components/core/test/CMakeLists.txt index 9344566..a74f55c 100644 --- a/Software/components/core/test/CMakeLists.txt +++ b/Software/components/core/test/CMakeLists.txt @@ -21,6 +21,7 @@ add_library(digiradio_core STATIC "${CORE_SRC_DIR}/WifiSsid.cpp" "${CORE_SRC_DIR}/WifiCredentials.cpp" "${CORE_SRC_DIR}/WifiProvisionJson.cpp" + "${CORE_SRC_DIR}/WifiScanJson.cpp" "${CORE_SRC_DIR}/EmbeddedBlobReader.cpp" "${CORE_SRC_DIR}/TunerJson.cpp" "${CORE_SRC_DIR}/FrequencyKHz.cpp" @@ -50,6 +51,7 @@ add_library(digiradio_core STATIC "${CORE_SRC_DIR}/RegisterWrite.cpp" "${CORE_SRC_DIR}/DspProgramBlob.cpp" "${CORE_SRC_DIR}/OtaAppDescriptor.cpp" + "${CORE_SRC_DIR}/WebRadioJson.cpp" ) target_include_directories(digiradio_core PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../include" @@ -75,6 +77,10 @@ add_executable(wifi_provision_test wifi_provision_test.cpp) target_link_libraries(wifi_provision_test PRIVATE digiradio_core) add_test(NAME wifi_provision_test COMMAND wifi_provision_test) +add_executable(wifi_scan_test wifi_scan_test.cpp) +target_link_libraries(wifi_scan_test PRIVATE digiradio_core) +add_test(NAME wifi_scan_test COMMAND wifi_scan_test) + add_executable(embedded_blob_reader_test embedded_blob_reader_test.cpp) target_link_libraries(embedded_blob_reader_test PRIVATE digiradio_core) add_test(NAME embedded_blob_reader_test COMMAND embedded_blob_reader_test) @@ -101,6 +107,7 @@ add_test(NAME enhancements_design_test COMMAND enhancements_design_test) add_executable(station_service_test station_service_test.cpp) target_include_directories(station_service_test PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/host_stubs" "${CMAKE_CURRENT_SOURCE_DIR}/../../services/station/include" "${CMAKE_CURRENT_SOURCE_DIR}/../../services/tuner/include" ) @@ -123,8 +130,13 @@ add_executable(broadcast_metadata_test broadcast_metadata_test.cpp) target_link_libraries(broadcast_metadata_test PRIVATE digiradio_core) add_test(NAME broadcast_metadata_test COMMAND broadcast_metadata_test) +add_executable(web_radio_json_test web_radio_json_test.cpp) +target_link_libraries(web_radio_json_test PRIVATE digiradio_core) +add_test(NAME web_radio_json_test COMMAND web_radio_json_test) + add_executable(integration_service_test integration_service_test.cpp) target_include_directories(integration_service_test PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/host_stubs" "${CMAKE_CURRENT_SOURCE_DIR}/../../services/integration/include" "${CMAKE_CURRENT_SOURCE_DIR}/../../services/station/include" "${CMAKE_CURRENT_SOURCE_DIR}/../../services/tuner/include" diff --git a/Software/components/core/test/audio_profile_json_test.cpp b/Software/components/core/test/audio_profile_json_test.cpp index 6c47f45..1a9e2d6 100644 --- a/Software/components/core/test/audio_profile_json_test.cpp +++ b/Software/components/core/test/audio_profile_json_test.cpp @@ -72,6 +72,31 @@ namespace { return EXIT_SUCCESS; } +[[nodiscard]] int runBeepEnabledJsonTest() +{ + const auto onParsed = core::parseBeepEnabledJson(R"({"enabled":true})"); + if (!onParsed || *onParsed != true) { + std::cerr << "beep enabled=true parse mismatch\n"; + return EXIT_FAILURE; + } + const auto offParsed = core::parseBeepEnabledJson(R"({"enabled":false})"); + if (!offParsed || *offParsed != false) { + std::cerr << "beep enabled=false parse mismatch\n"; + return EXIT_FAILURE; + } + const auto missing = core::parseBeepEnabledJson(R"({})"); + if (missing) { + std::cerr << "beep missing field should fail\n"; + return EXIT_FAILURE; + } + const auto malformed = core::parseBeepEnabledJson("not json"); + if (malformed) { + std::cerr << "beep malformed body should fail\n"; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} + } // namespace int main() @@ -79,5 +104,8 @@ int main() if (runRoundTripTest() != EXIT_SUCCESS) { return EXIT_FAILURE; } + if (runBeepEnabledJsonTest() != EXIT_SUCCESS) { + return EXIT_FAILURE; + } return EXIT_SUCCESS; } diff --git a/Software/components/core/test/bt1035_at_test.cpp b/Software/components/core/test/bt1035_at_test.cpp index b6f9300..f529165 100644 --- a/Software/components/core/test/bt1035_at_test.cpp +++ b/Software/components/core/test/bt1035_at_test.cpp @@ -13,6 +13,7 @@ #include "core/Bt1035At.hpp" #include "core/Bt1035PairedDevice.hpp" +#include "core/Bt1035ScannedDevice.hpp" #include "core/BluetoothJson.hpp" #include @@ -32,7 +33,7 @@ namespace { std::cerr << "I2S mode must be in init sequence\n"; return EXIT_FAILURE; } - if (sequence[2U] != core::Bt1035AtCommand::I2sSlave48k32) { + if (sequence[2U] != core::Bt1035AtCommand::I2sSlave48k24) { std::cerr << "I2SCFG must be in init sequence\n"; return EXIT_FAILURE; } @@ -43,9 +44,15 @@ namespace { return EXIT_FAILURE; } const std::string i2sCfg = - core::buildBt1035AtLine(core::Bt1035AtCommand::I2sSlave48k32); - if (i2sCfg != "AT+I2SCFG=67\r\n") { - std::cerr << "I2SCFG=67 command line mismatch\n"; + core::buildBt1035AtLine(core::Bt1035AtCommand::I2sSlave48k24); + if (i2sCfg != "AT+I2SCFG=35\r\n") { + std::cerr << "I2SCFG=35 command line mismatch\n"; + return EXIT_FAILURE; + } + const std::string reset = + core::buildBt1035AtLine(core::Bt1035AtCommand::Reset); + if (reset != "AT+RESET\r\n") { + std::cerr << "AT+RESET command line mismatch\n"; return EXIT_FAILURE; } return EXIT_SUCCESS; @@ -136,6 +143,115 @@ namespace { return EXIT_SUCCESS; } +[[nodiscard]] int runScanConnectTest() +{ + if (core::buildBt1035StartScanLine(1U, 20U) != "AT+SCAN=1,20\r\n") { + std::cerr << "SCAN start line mismatch\n"; + return EXIT_FAILURE; + } + if (core::buildBt1035StartScanLine(1U, 0U) != "AT+SCAN=1\r\n") { + std::cerr << "SCAN default line mismatch\n"; + return EXIT_FAILURE; + } + if (core::buildBt1035StartScanLine(2U, 15U) != "AT+SCAN=2,15\r\n") { + std::cerr << "BLE SCAN line mismatch\n"; + return EXIT_FAILURE; + } + if (core::buildBt1035EnablePrintLine() != "AT+PRINT=1\r\n") { + std::cerr << "PRINT line mismatch\n"; + return EXIT_FAILURE; + } + if (core::buildBt1035DisableAutoLinkLine() != "AT+LINKCFG=0,0\r\n") { + std::cerr << "LINKCFG line mismatch\n"; + return EXIT_FAILURE; + } + if (core::buildBt1035ClearPairedListLine() != "AT+PLIST=0\r\n") { + std::cerr << "PLIST clear line mismatch\n"; + return EXIT_FAILURE; + } + if (core::buildBt1035DisconnectAllLine() != "AT+DSCA\r\n") { + std::cerr << "DSCA line mismatch\n"; + return EXIT_FAILURE; + } + if (core::buildBt1035StopScanLine() != "AT+SCAN=0\r\n") { + std::cerr << "SCAN stop line mismatch\n"; + return EXIT_FAILURE; + } + if (!core::isValidBt1035Mac("AABBCCDDEEFF") + || core::isValidBt1035Mac("bad")) { + std::cerr << "MAC validation failed\n"; + return EXIT_FAILURE; + } + if (core::buildBt1035A2dpConnectLine("aabbccddeeff") + != "AT+A2DPCONN=aabbccddeeff\r\n") { + std::cerr << "A2DPCONN line mismatch\n"; + return EXIT_FAILURE; + } + if (core::buildBt1035A2dpAudioLine(true) != "AT+A2DPAUDIO=1\r\n") { + std::cerr << "A2DPAUDIO=1 line mismatch\n"; + return EXIT_FAILURE; + } + if (core::buildBt1035A2dpAudioLine(false) != "AT+A2DPAUDIO=0\r\n") { + std::cerr << "A2DPAUDIO=0 line mismatch\n"; + return EXIT_FAILURE; + } + const auto scanned = core::parseBt1035ScanResponse( + "+SCAN=1,0,112233445566,-55,7,MyPhone,240404\r\n" + "+SCAN=2,0,FFEEDDCCBBAA,-70,0,,240404\r\n" + "+SCAN=E\r\n" + "OK\r\n"); + if (!scanned || scanned->size() != 2U || (*scanned)[0U].mac != "112233445566" + || (*scanned)[0U].name != "MyPhone" || (*scanned)[0U].rssiDbm != -55 + || !(*scanned)[1U].name.empty()) { + std::cerr << "SCAN parse failed\n"; + return EXIT_FAILURE; + } + const auto colonMac = core::parseBt1035ScanResponse( + "+SCAN=1,2,AA:BB:CC:DD:EE:FF,-60,4,Test,240404\r\n+SCAN=E\r\n"); + if (!colonMac || colonMac->size() != 1U + || (*colonMac)[0U].mac != "AABBCCDDEEFF") { + std::cerr << "SCAN colon MAC parse failed\n"; + return EXIT_FAILURE; + } + const auto userLogScan = core::parseBt1035ScanResponse( + "+DEVSTAT=9\r\n\r\nOK\r\n\r\n" + "+SCAN=1,2,6960BB7EC5AA,-71,8,HY300PRO,1A0114\r\n\r\n" + "+SCAN=2,2,BC87FAE69D6E,-49,0\r\n\r\n" + "+DEVSTAT=1\r\n"); + if (!userLogScan || userLogScan->size() != 2U + || (*userLogScan)[0U].name != "HY300PRO" + || (*userLogScan)[0U].mac != "6960BB7EC5AA" + || (*userLogScan)[1U].mac != "BC87FAE69D6E" + || !(*userLogScan)[1U].name.empty() + || (*userLogScan)[1U].rssiDbm != -49) { + std::cerr << "SCAN user-log payload parse failed\n"; + return EXIT_FAILURE; + } + const auto bareEmptyName = core::parseBt1035ScanResponse( + "+SCAN=2,2,BC87FAE69D6E,-49,0\r\n"); + if (!bareEmptyName || bareEmptyName->size() != 1U + || (*bareEmptyName)[0U].mac != "BC87FAE69D6E" + || !(*bareEmptyName)[0U].name.empty() + || !(*bareEmptyName)[0U].deviceClass.empty()) { + std::cerr << "SCAN bare empty-name line parse failed\n"; + return EXIT_FAILURE; + } + const std::string scanJson = + core::serializeBluetoothScanJson(*scanned); + if (scanJson.find("\"mac\":\"112233445566\"") == std::string::npos + || scanJson.find("\"rssi_dbm\":-55") == std::string::npos) { + std::cerr << "scan JSON serialise failed: " << scanJson << '\n'; + return EXIT_FAILURE; + } + const auto mac = + core::parseBluetoothConnectJson(R"({"mac":"112233445566"})"); + if (!mac || *mac != "112233445566") { + std::cerr << "connect JSON parse failed\n"; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} + } // namespace int main() @@ -149,5 +265,8 @@ int main() if (runNameAutoConnPairedParseTest() != EXIT_SUCCESS) { return EXIT_FAILURE; } + if (runScanConnectTest() != EXIT_SUCCESS) { + return EXIT_FAILURE; + } return EXIT_SUCCESS; } diff --git a/Software/components/core/test/host_stubs/esp_log.h b/Software/components/core/test/host_stubs/esp_log.h new file mode 100644 index 0000000..83592a9 --- /dev/null +++ b/Software/components/core/test/host_stubs/esp_log.h @@ -0,0 +1,21 @@ +/** + * @file esp_log.h + * @brief Host-test stand-in for ESP-IDF logging macros. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Not shipped to device firmware: idf.py builds resolve the real ESP-IDF + * esp_log.h first. Only used so services/tuner/src/TunerService.cpp — which + * logs scan progress on real hardware — can also compile against + * components/core/test host tests without pulling in ESP-IDF. + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#define ESP_LOGE(tag, fmt, ...) ((void)0) +#define ESP_LOGW(tag, fmt, ...) ((void)0) +#define ESP_LOGI(tag, fmt, ...) ((void)0) +#define ESP_LOGD(tag, fmt, ...) ((void)0) +#define ESP_LOGV(tag, fmt, ...) ((void)0) diff --git a/Software/components/core/test/host_stubs/freertos/FreeRTOS.h b/Software/components/core/test/host_stubs/freertos/FreeRTOS.h new file mode 100644 index 0000000..9757e7e --- /dev/null +++ b/Software/components/core/test/host_stubs/freertos/FreeRTOS.h @@ -0,0 +1,19 @@ +/** + * @file FreeRTOS.h + * @brief Host-test stand-in for the FreeRTOS core header. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Not shipped to device firmware: idf.py builds resolve the real FreeRTOS + * headers first. Only used so services/tuner/src/TunerService.cpp — which + * paces scan steps with vTaskDelay on real hardware — can also compile + * against components/core/test host tests without pulling in FreeRTOS. + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +using TickType_t = unsigned int; + +#define pdMS_TO_TICKS(ms) (static_cast(ms)) diff --git a/Software/components/core/test/host_stubs/freertos/task.h b/Software/components/core/test/host_stubs/freertos/task.h new file mode 100644 index 0000000..d2274e0 --- /dev/null +++ b/Software/components/core/test/host_stubs/freertos/task.h @@ -0,0 +1,18 @@ +/** + * @file task.h + * @brief Host-test stand-in for the FreeRTOS task API. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Not shipped to device firmware: idf.py builds resolve the real FreeRTOS + * headers first. vTaskDelay is a no-op here — host tests assert scan logic + * against a FakeTuner, not real hardware settle timing. + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include "freertos/FreeRTOS.h" + +inline void vTaskDelay(TickType_t) {} diff --git a/Software/components/core/test/integration_service_test.cpp b/Software/components/core/test/integration_service_test.cpp index dfa62cb..e8e7275 100644 --- a/Software/components/core/test/integration_service_test.cpp +++ b/Software/components/core/test/integration_service_test.cpp @@ -15,6 +15,7 @@ #include "core/FrequencyKHz.hpp" #include "core/IDsp.hpp" #include "core/ISecureStore.hpp" +#include "core/BtSpeakerTarget.hpp" #include "core/StationName.hpp" #include "core/TunerBand.hpp" #include "integration/IntegrationService.hpp" @@ -68,6 +69,12 @@ public: { return {}; } + + [[nodiscard]] std::expected setBeepEnabled( + bool) override + { + return {}; + } }; class TrackingTuner final : public core::ITuner { @@ -217,9 +224,60 @@ public: return {}; } + [[nodiscard]] bool hasBtSpeakerTarget() const override + { + return btSpeaker_.has_value(); + } + + [[nodiscard]] std::expected saveBtSpeakerTarget( + const core::BtSpeakerTarget& target) override + { + btSpeaker_ = target; + return {}; + } + + [[nodiscard]] std::expected + loadBtSpeakerTarget() const override + { + if (!btSpeaker_) { + return std::unexpected(core::StoreError::NotFound); + } + return *btSpeaker_; + } + + [[nodiscard]] std::expected clearBtSpeakerTarget() + override + { + btSpeaker_.reset(); + return {}; + } + + [[nodiscard]] bool hasWebRadioConfig() const override + { + return webRadioJson_.has_value(); + } + + [[nodiscard]] std::expected + saveWebRadioConfigJson(std::string_view json) override + { + webRadioJson_ = std::string(json); + return {}; + } + + [[nodiscard]] std::expected + loadWebRadioConfigJson() const override + { + if (!webRadioJson_) { + return std::unexpected(core::StoreError::NotFound); + } + return *webRadioJson_; + } + private: std::optional stationJson_; std::optional lastPresetIndex_; + std::optional btSpeaker_; + std::optional webRadioJson_; }; [[nodiscard]] core::Station makeFmStation(const char* name, std::uint32_t khz) diff --git a/Software/components/core/test/station_service_test.cpp b/Software/components/core/test/station_service_test.cpp index 43c661b..d82a267 100644 --- a/Software/components/core/test/station_service_test.cpp +++ b/Software/components/core/test/station_service_test.cpp @@ -171,9 +171,54 @@ public: return {}; } + [[nodiscard]] bool hasBtSpeakerTarget() const override + { + return false; + } + + [[nodiscard]] std::expected saveBtSpeakerTarget( + const core::BtSpeakerTarget&) override + { + return {}; + } + + [[nodiscard]] std::expected + loadBtSpeakerTarget() const override + { + return std::unexpected(core::StoreError::NotFound); + } + + [[nodiscard]] std::expected clearBtSpeakerTarget() + override + { + return {}; + } + + [[nodiscard]] bool hasWebRadioConfig() const override + { + return webRadioJson_.has_value(); + } + + [[nodiscard]] std::expected + saveWebRadioConfigJson(std::string_view json) override + { + webRadioJson_ = std::string(json); + return {}; + } + + [[nodiscard]] std::expected + loadWebRadioConfigJson() const override + { + if (!webRadioJson_) { + return std::unexpected(core::StoreError::NotFound); + } + return *webRadioJson_; + } + private: std::optional stationJson_; std::optional lastPresetIndex_; + std::optional webRadioJson_; }; [[nodiscard]] core::Station makeFmStation(const char* name, std::uint32_t khz) diff --git a/Software/components/core/test/web_radio_json_test.cpp b/Software/components/core/test/web_radio_json_test.cpp new file mode 100644 index 0000000..891a111 --- /dev/null +++ b/Software/components/core/test/web_radio_json_test.cpp @@ -0,0 +1,73 @@ +/** + * @file web_radio_json_test.cpp + * @brief Host tests for WebRadioConfig JSON round-trip. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-08-08 + */ + +#include "core/WebRadioJson.hpp" + +#include +#include + +namespace { + +[[nodiscard]] int runRoundTripTest() +{ + const core::WebRadioConfig config{ + .enabled = true, .url = "http://edge.radiomontecarlo.net/RMC.mp3"}; + const std::string json = core::serializeWebRadioConfigJson(config); + const auto parsed = core::parseWebRadioConfigJson(json); + if (!parsed || parsed->enabled != true || parsed->url != config.url) { + std::cerr << "round-trip mismatch\n"; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} + +[[nodiscard]] int runValidationTest() +{ + const auto missingUrl = + core::parseWebRadioConfigJson(R"({"enabled":false})"); + if (missingUrl) { + std::cerr << "missing url should fail\n"; + return EXIT_FAILURE; + } + const auto badScheme = core::parseWebRadioConfigJson( + R"({"enabled":true,"url":"https://example.com/x.mp3"})"); + if (badScheme) { + std::cerr << "non-http scheme should fail\n"; + return EXIT_FAILURE; + } + const auto malformed = core::parseWebRadioConfigJson("not json"); + if (malformed) { + std::cerr << "malformed body should fail\n"; + return EXIT_FAILURE; + } + const auto ok = core::parseWebRadioConfigJson( + R"({"enabled":false,"url":"http://example.com/x.mp3"})"); + if (!ok || ok->enabled != false) { + std::cerr << "valid disabled config should parse\n"; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} + +} // namespace + +int main() +{ + if (runRoundTripTest() != EXIT_SUCCESS) { + return EXIT_FAILURE; + } + if (runValidationTest() != EXIT_SUCCESS) { + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} diff --git a/Software/components/core/test/wifi_scan_test.cpp b/Software/components/core/test/wifi_scan_test.cpp new file mode 100644 index 0000000..a36c7a5 --- /dev/null +++ b/Software/components/core/test/wifi_scan_test.cpp @@ -0,0 +1,121 @@ +/** + * @file wifi_scan_test.cpp + * @brief Host tests for Wi-Fi scan JSON serialisation. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-08-05 + */ + +#include "core/WifiScanJson.hpp" + +#include +#include +#include +#include + +namespace { + +/** + * @brief expectEqual — assert two strings match. + * + * @dname expectEqual + * @param actual Observed value. + * @param expected Expected value. + * @return true when equal. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] bool expectEqual(const std::string& actual, + const std::string& expected) +{ + if (actual == expected) { + return true; + } + std::cerr << "expected: " << expected << "\nactual: " << actual << '\n'; + return false; +} + +/** + * @brief runWifiScanSerialiseTest — verify scan list JSON shape. + * + * @dname runWifiScanSerialiseTest + * @return EXIT_SUCCESS or EXIT_FAILURE. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] int runWifiScanSerialiseTest() +{ + const std::vector networks = { + { + .ssid = "HomeNet", + .rssiDbm = -42, + .auth = "wpa2", + .channel = 6, + }, + { + .ssid = "Guest\"WiFi", + .rssiDbm = -71, + .auth = "open", + .channel = 11, + }, + }; + + const std::string json = core::serializeWifiScanJson(networks); + const std::string expected = + R"({"networks":[{"ssid":"HomeNet","rssi_dbm":-42,"auth":"wpa2","channel":6},{"ssid":"Guest\"WiFi","rssi_dbm":-71,"auth":"open","channel":11}]})"; + if (!expectEqual(json, expected)) { + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} + +/** + * @brief runWifiScanErrorSerialiseTest — verify error JSON. + * + * @dname runWifiScanErrorSerialiseTest + * @return EXIT_SUCCESS or EXIT_FAILURE. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] int runWifiScanErrorSerialiseTest() +{ + if (!expectEqual(core::serializeWifiScanErrorJson("scan_failed"), + R"({"status":"error","reason":"scan_failed"})")) { + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} + +} // namespace + +/** + * @brief main — host test entry point. + * + * @dname main + * @return EXIT_SUCCESS when all tests pass. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +int main() +{ + if (runWifiScanSerialiseTest() != EXIT_SUCCESS) { + return EXIT_FAILURE; + } + if (runWifiScanErrorSerialiseTest() != EXIT_SUCCESS) { + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} diff --git a/Software/components/drivers/adau1701/include/adau1701/Adau1701Driver.hpp b/Software/components/drivers/adau1701/include/adau1701/Adau1701Driver.hpp index acf6753..a94d7a5 100644 --- a/Software/components/drivers/adau1701/include/adau1701/Adau1701Driver.hpp +++ b/Software/components/drivers/adau1701/include/adau1701/Adau1701Driver.hpp @@ -220,6 +220,20 @@ public: core::EqBandIndex band, core::GainDb gain, core::FrequencyHz center, float q); + /** + * @brief setBeepEnabled — gate the SigmaStudio Beep1 tone generator. + * + * @dname setBeepEnabled + * @param enabled true unmutes Beep1, false mutes it. + * @return Ok on success, or Adau1701Error. + * @pubstate writes parameter RAM via safeload (ADDR_BEEP1_ENABLE). + * + * @author Michele Bigi + * @date 2026-08-07 + */ + [[nodiscard]] std::expected setBeepEnabled( + bool enabled); + private: [[nodiscard]] std::expected ensureBooted() const; [[nodiscard]] std::expected safeloadGain( diff --git a/Software/components/drivers/adau1701/include/adau1701/Adau1701Dsp.hpp b/Software/components/drivers/adau1701/include/adau1701/Adau1701Dsp.hpp index 8010271..fcd363f 100644 --- a/Software/components/drivers/adau1701/include/adau1701/Adau1701Dsp.hpp +++ b/Software/components/drivers/adau1701/include/adau1701/Adau1701Dsp.hpp @@ -61,6 +61,9 @@ public: core::EqBandIndex band, core::GainDb gain, core::FrequencyHz center, float q) override; + [[nodiscard]] std::expected setBeepEnabled( + bool enabled) override; + private: [[nodiscard]] static core::DspError mapError(Adau1701Error error) noexcept; diff --git a/Software/components/drivers/adau1701/src/Adau1701Driver.cpp b/Software/components/drivers/adau1701/src/Adau1701Driver.cpp index bdad130..b049c16 100644 --- a/Software/components/drivers/adau1701/src/Adau1701Driver.cpp +++ b/Software/components/drivers/adau1701/src/Adau1701Driver.cpp @@ -27,273 +27,345 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" -extern "C" { +extern "C" +{ } // extern "C" -namespace adau1701 { - -namespace { -constexpr char kTag[] = "Adau1701"; -constexpr int kI2cPort = 0; -/** Index 0 is the fixed high-pass band (SigmaStudio band 1); not safeloaded. */ -constexpr std::uint8_t kFixedHighPassBandIndex = 0U; -} // namespace - -Adau1701Driver::Adau1701Driver(Adau1701Pins pins, - core::IDspProgramSource& programSource) - : pins_(pins) - , programSource_(programSource) - , booted_(false) - , i2cBus_(nullptr) - , i2cDev_(nullptr) +namespace adau1701 { -} -Adau1701Driver::~Adau1701Driver() -{ - auto* dev = static_cast(i2cDev_); - auto* bus = static_cast(i2cBus_); - if (dev != nullptr) { - i2c_master_bus_rm_device(dev); + namespace + { + constexpr char kTag[] = "Adau1701"; + constexpr int kI2cPort = 0; + /** Index 0 is the fixed high-pass band (SigmaStudio band 1); not safeloaded. */ + constexpr std::uint8_t kFixedHighPassBandIndex = 0U; + } // namespace + + Adau1701Driver::Adau1701Driver(Adau1701Pins pins, + core::IDspProgramSource &programSource) + : pins_(pins), programSource_(programSource), booted_(false), i2cBus_(nullptr), i2cDev_(nullptr) + { } - if (bus != nullptr) { - i2c_del_master_bus(bus); - } -} -std::expected Adau1701Driver::replayProgram( - const core::DspProgram& program) -{ - const unsigned char deviceAddr = - static_cast(pins_.i2cAddr7 << 1); - for (const core::RegisterWrite& write : program.writes()) { - const auto data = write.data(); - if (data.empty()) { - return std::unexpected(Adau1701Error::DownloadFailed); + Adau1701Driver::~Adau1701Driver() + { + auto *dev = static_cast(i2cDev_); + auto *bus = static_cast(i2cBus_); + if (dev != nullptr) + { + i2c_master_bus_rm_device(dev); + } + if (bus != nullptr) + { + i2c_del_master_bus(bus); } - SIGMA_WRITE_REGISTER_BLOCK( - deviceAddr, - write.address(), - static_cast(data.size()), - const_cast( - reinterpret_cast(data.data()))); } - return {}; -} -std::expected Adau1701Driver::boot() -{ - if (booted_) { + std::expected Adau1701Driver::replayProgram( + const core::DspProgram &program) + { + const unsigned char deviceAddr = + static_cast(pins_.i2cAddr7 << 1); + for (const core::RegisterWrite &write : program.writes()) + { + const auto data = write.data(); + if (data.empty()) + { + return std::unexpected(Adau1701Error::DownloadFailed); + } + SIGMA_WRITE_REGISTER_BLOCK( + deviceAddr, + write.address(), + static_cast(data.size()), + const_cast( + reinterpret_cast(data.data()))); + } return {}; } - gpio_config_t resetCfg = {}; - resetCfg.pin_bit_mask = 1ULL << pins_.resetGpio; - resetCfg.mode = GPIO_MODE_OUTPUT; - if (gpio_config(&resetCfg) != ESP_OK) { - return std::unexpected(Adau1701Error::ResetFailed); - } - - gpio_set_level(static_cast(pins_.resetGpio), 0); - vTaskDelay(pdMS_TO_TICKS(10)); - gpio_set_level(static_cast(pins_.resetGpio), 1); - vTaskDelay(pdMS_TO_TICKS(10)); - - i2c_master_bus_config_t busCfg = {}; - busCfg.i2c_port = static_cast(kI2cPort); - busCfg.sda_io_num = static_cast(pins_.i2cSda); - busCfg.scl_io_num = static_cast(pins_.i2cScl); - busCfg.clk_source = I2C_CLK_SRC_DEFAULT; - busCfg.glitch_ignore_cnt = 7; - busCfg.flags.enable_internal_pullup = true; - - i2c_master_bus_handle_t bus = nullptr; - if (i2c_new_master_bus(&busCfg, &bus) != ESP_OK) { - ESP_LOGE(kTag, "i2c_new_master_bus failed"); - return std::unexpected(Adau1701Error::I2cInitFailed); - } - i2cBus_ = bus; - - i2c_device_config_t devCfg = {}; - devCfg.dev_addr_length = I2C_ADDR_BIT_LEN_7; - devCfg.device_address = static_cast(pins_.i2cAddr7); - devCfg.scl_speed_hz = 100000; - - i2c_master_dev_handle_t dev = nullptr; - if (i2c_master_bus_add_device(bus, &devCfg, &dev) != ESP_OK) { - ESP_LOGE(kTag, "i2c_master_bus_add_device failed"); - return std::unexpected(Adau1701Error::I2cInitFailed); - } - i2cDev_ = dev; - - sigma_studio_bind_i2c(kI2cPort, static_cast(pins_.i2cAddr7)); - sigma_studio_set_device(dev); - - const auto program = programSource_.loadProgram(); - if (!program) { - ESP_LOGE(kTag, "DSP program load failed"); - return std::unexpected(Adau1701Error::DownloadFailed); - } - if (auto replay = replayProgram(*program); !replay) { - return replay; - } - - booted_ = true; - ESP_LOGI(kTag, "SigmaStudio program loaded"); - return {}; -} - -bool Adau1701Driver::isBooted() const noexcept -{ - return booted_; -} - -void* Adau1701Driver::i2cBusHandle() const noexcept -{ - return i2cBus_; -} - -std::expected Adau1701Driver::ensureBooted() const -{ - if (!booted_) { - return std::unexpected(Adau1701Error::NotBooted); - } - return {}; -} - -std::expected Adau1701Driver::safeloadFixpoint( - unsigned paramAddr, std::int32_t fixpoint) -{ - if (sigma_safeload_param(paramAddr, fixpoint) != 0) { - return std::unexpected(Adau1701Error::SafeloadFailed); - } - return {}; -} - -std::expected Adau1701Driver::safeloadGain( - unsigned paramAddr, core::GainDb gain) -{ - return safeloadFixpoint(paramAddr, core::gainDbToLinearFixpoint(gain)); -} - -std::expected Adau1701Driver::setInputVolume( - core::MixSource source, core::GainDb left, core::GainDb right) -{ - if (auto ready = ensureBooted(); !ready) { - return ready; - } - if (auto result = safeloadGain(paramAddrInputLeft(source), left); !result) { - return result; - } - return safeloadGain(paramAddrInputRight(source), right); -} - -std::expected Adau1701Driver::setMasterVolume( - core::GainDb left, core::GainDb right) -{ - if (auto ready = ensureBooted(); !ready) { - return ready; - } - if (auto result = safeloadGain(static_cast(ADDR_MULTIPLE1), left); - !result) { - return result; - } - return safeloadGain(static_cast(ADDR_MULTIPLE1_1), right); -} - -std::expected Adau1701Driver::applyMixer( - const core::MixerState& mixer) -{ - if (auto ready = ensureBooted(); !ready) { - return ready; - } - if (auto result = setInputVolume(core::MixSource::Si4684, mixer.si4684Left, - mixer.si4684Right); - !result) { - return result; - } - if (auto result = setInputVolume(core::MixSource::Esp32, mixer.esp32Left, - mixer.esp32Right); - !result) { - return result; - } - if (auto result = - safeloadGain(static_cast(ADDR_STMIXER1_ST0_VOLUME), - mixer.mixLeft); - !result) { - return result; - } - return safeloadGain(static_cast(ADDR_STMIXER1_ST1_VOLUME), - mixer.mixRight); -} - -std::expected Adau1701Driver::setEqBand( - core::EqBandIndex band, core::GainDb gain, core::FrequencyHz center, float q) -{ - if (band.value() == kFixedHighPassBandIndex) { - return std::unexpected(Adau1701Error::InvalidParameter); - } - - if (auto ready = ensureBooted(); !ready) { - return ready; - } - - const core::BiquadCoefficients coeffs = - core::designPeakingEq(center, gain, q); - const auto fixpoints = coeffs.toFixpoint823(); - const unsigned baseAddr = paramAddrEqBandBase(band.value()); - - unsigned addrs[5U]; - int values[5U]; - for (unsigned i = 0U; i < 5U; ++i) { - addrs[i] = baseAddr + i; - values[i] = fixpoints[i]; - } - - if (sigma_safeload_block(5U, addrs, values) != 0) { - return std::unexpected(Adau1701Error::SafeloadFailed); - } - return {}; -} - -std::expected Adau1701Driver::applyEq( - const core::EqProfile& eq) -{ - if (auto ready = ensureBooted(); !ready) { - return ready; - } - - for (std::uint8_t i = 0; i < core::EqBandIndex::kBandCount; ++i) { - if (i == kFixedHighPassBandIndex) { - continue; + std::expected Adau1701Driver::boot() + { + if (booted_) + { + return {}; } - const auto index = core::EqBandIndex::tryFromIndex(i); - if (!index) { + + gpio_config_t resetCfg = {}; + resetCfg.pin_bit_mask = 1ULL << pins_.resetGpio; + resetCfg.mode = GPIO_MODE_OUTPUT; + if (gpio_config(&resetCfg) != ESP_OK) + { + return std::unexpected(Adau1701Error::ResetFailed); + } + + gpio_set_level(static_cast(pins_.resetGpio), 0); + vTaskDelay(pdMS_TO_TICKS(10)); + gpio_set_level(static_cast(pins_.resetGpio), 1); + vTaskDelay(pdMS_TO_TICKS(10)); + + i2c_master_bus_config_t busCfg = {}; + busCfg.i2c_port = static_cast(kI2cPort); + busCfg.sda_io_num = static_cast(pins_.i2cSda); + busCfg.scl_io_num = static_cast(pins_.i2cScl); + busCfg.clk_source = I2C_CLK_SRC_DEFAULT; + busCfg.glitch_ignore_cnt = 7; + busCfg.flags.enable_internal_pullup = true; + + i2c_master_bus_handle_t bus = nullptr; + if (i2c_new_master_bus(&busCfg, &bus) != ESP_OK) + { + ESP_LOGE(kTag, "i2c_new_master_bus failed"); + return std::unexpected(Adau1701Error::I2cInitFailed); + } + i2cBus_ = bus; + + i2c_device_config_t devCfg = {}; + devCfg.dev_addr_length = I2C_ADDR_BIT_LEN_7; + devCfg.device_address = static_cast(pins_.i2cAddr7); + devCfg.scl_speed_hz = 100000; + + i2c_master_dev_handle_t dev = nullptr; + if (i2c_master_bus_add_device(bus, &devCfg, &dev) != ESP_OK) + { + ESP_LOGE(kTag, "i2c_master_bus_add_device failed"); + return std::unexpected(Adau1701Error::I2cInitFailed); + } + i2cDev_ = dev; + + sigma_studio_bind_i2c(kI2cPort, static_cast(pins_.i2cAddr7)); + sigma_studio_set_device(dev); + + const auto program = programSource_.loadProgram(); + if (!program) + { + ESP_LOGE(kTag, "DSP program load failed"); + return std::unexpected(Adau1701Error::DownloadFailed); + } + ESP_LOGI(kTag, + "DSP program contains %u writes", + static_cast(program->writes().size())); + for (const auto &w : program->writes()) + { + ESP_LOGI(kTag, + "ADDR=0x%04X LEN=%u", + static_cast(w.address()), + static_cast(w.data().size())); + } + if (auto replay = replayProgram(*program); !replay) + { + return replay; + } + + booted_ = true; + ESP_LOGI(kTag, "SigmaStudio program loaded"); + return {}; + } + + bool Adau1701Driver::isBooted() const noexcept + { + return booted_; + } + + void *Adau1701Driver::i2cBusHandle() const noexcept + { + return i2cBus_; + } + + std::expected Adau1701Driver::ensureBooted() const + { + if (!booted_) + { + return std::unexpected(Adau1701Error::NotBooted); + } + return {}; + } + + std::expected Adau1701Driver::safeloadFixpoint( + unsigned paramAddr, std::int32_t fixpoint) + { + sigma_studio_lock(); + const int result = sigma_safeload_param(paramAddr, fixpoint); + sigma_studio_unlock(); + if (result != 0) + { return std::unexpected(Adau1701Error::SafeloadFailed); } - const core::EqBandSettings& band = eq.band(*index); - if (auto result = setEqBand(*index, band.gain, band.center, band.q); - !result) { + return {}; + } + + std::expected Adau1701Driver::safeloadGain( + unsigned paramAddr, core::GainDb gain) + { + return safeloadFixpoint(paramAddr, core::gainDbToLinearFixpoint(gain)); + } + + std::expected Adau1701Driver::setInputVolume( + core::MixSource source, core::GainDb left, core::GainDb right) + { + if (auto ready = ensureBooted(); !ready) + { + return ready; + } + if (auto result = safeloadGain(paramAddrInputLeft(source), left); !result) + { return result; } + return safeloadGain(paramAddrInputRight(source), right); } - return {}; -} -std::expected Adau1701Driver::applyProfile( - const core::AudioProfile& profile) -{ - if (auto ready = ensureBooted(); !ready) { - return ready; + std::expected Adau1701Driver::setMasterVolume( + core::GainDb left, core::GainDb right) + { + if (auto ready = ensureBooted(); !ready) + { + return ready; + } + if (auto result = safeloadGain(static_cast(ADDR_MULTIPLE1), left); + !result) + { + return result; + } + return safeloadGain(static_cast(ADDR_MULTIPLE1_1), right); } - if (auto result = applyMixer(profile.mixer); !result) { - return result; + + std::expected Adau1701Driver::applyMixer( + const core::MixerState &mixer) + { + if (auto ready = ensureBooted(); !ready) + { + return ready; + } + if (auto result = setInputVolume(core::MixSource::Si4684, mixer.si4684Left, + mixer.si4684Right); + !result) + { + return result; + } + if (auto result = setInputVolume(core::MixSource::Esp32, mixer.esp32Left, + mixer.esp32Right); + !result) + { + return result; + } + if (auto result = + safeloadGain(static_cast(ADDR_STMIXER1_ST0_VOLUME), + mixer.mixLeft); + !result) + { + return result; + } + return safeloadGain(static_cast(ADDR_STMIXER1_ST1_VOLUME), + mixer.mixRight); } - if (auto result = applyEq(profile.eq); !result) { - return result; + + std::expected Adau1701Driver::setEqBand( + core::EqBandIndex band, core::GainDb gain, core::FrequencyHz center, float q) + { + if (band.value() == kFixedHighPassBandIndex) + { + return std::unexpected(Adau1701Error::InvalidParameter); + } + + if (auto ready = ensureBooted(); !ready) + { + return ready; + } + + const core::BiquadCoefficients coeffs = + core::designPeakingEq(center, gain, q); + const auto fixpoints = coeffs.toFixpoint823(); + const unsigned baseAddr = paramAddrEqBandBase(band.value()); + + unsigned addrs[5U]; + int values[5U]; + for (unsigned i = 0U; i < 5U; ++i) + { + addrs[i] = baseAddr + i; + values[i] = fixpoints[i]; + } + + sigma_studio_lock(); + const int result = sigma_safeload_block(5U, addrs, values); + sigma_studio_unlock(); + if (result != 0) + { + return std::unexpected(Adau1701Error::SafeloadFailed); + } + return {}; + } + + std::expected Adau1701Driver::setBeepEnabled( + bool enabled) + { + if (auto ready = ensureBooted(); !ready) + { + return ready; + } + // Beep1 ("Beep - variable gain", ADI Sound Generation toolbox, + // DigiRadio.params) ENABLE/KICK: unity fixpoint 0x00800000 = on, + // exact zero = off. Not continuous gains, so bypass + // safeloadGain/GainDb (whose quietest value is -96 dB, not true + // zero) and write the raw fixpoint. KICK is the cell's trigger + // input (per its own SigmaStudio parameter name); ENABLE alone + // may leave the generator gated shut without it. + const std::int32_t value = + enabled ? core::gainDbToLinearFixpoint(core::GainDb::zero()) : 0; + if (auto result = safeloadFixpoint( + static_cast(ADDR_BEEP1_ENABLE), value); + !result) + { + return result; + } + return safeloadFixpoint(static_cast(ADDR_BEEP1_KICK), value); + } + + std::expected Adau1701Driver::applyEq( + const core::EqProfile &eq) + { + if (auto ready = ensureBooted(); !ready) + { + return ready; + } + + for (std::uint8_t i = 0; i < core::EqBandIndex::kBandCount; ++i) + { + if (i == kFixedHighPassBandIndex) + { + continue; + } + const auto index = core::EqBandIndex::tryFromIndex(i); + if (!index) + { + return std::unexpected(Adau1701Error::SafeloadFailed); + } + const core::EqBandSettings &band = eq.band(*index); + if (auto result = setEqBand(*index, band.gain, band.center, band.q); + !result) + { + return result; + } + } + return {}; + } + + std::expected Adau1701Driver::applyProfile( + const core::AudioProfile &profile) + { + if (auto ready = ensureBooted(); !ready) + { + return ready; + } + if (auto result = applyMixer(profile.mixer); !result) + { + return result; + } + if (auto result = applyEq(profile.eq); !result) + { + return result; + } + return setMasterVolume(profile.masterLeft, profile.masterRight); } - return setMasterVolume(profile.masterLeft, profile.masterRight); -} } // namespace adau1701 diff --git a/Software/components/drivers/adau1701/src/Adau1701Dsp.cpp b/Software/components/drivers/adau1701/src/Adau1701Dsp.cpp index 1a0834b..c570867 100644 --- a/Software/components/drivers/adau1701/src/Adau1701Dsp.cpp +++ b/Software/components/drivers/adau1701/src/Adau1701Dsp.cpp @@ -89,4 +89,12 @@ std::expected Adau1701Dsp::setEqBand( return {}; } +std::expected Adau1701Dsp::setBeepEnabled(bool enabled) +{ + if (auto result = driver_.setBeepEnabled(enabled); !result) { + return std::unexpected(mapError(result.error())); + } + return {}; +} + } // namespace adau1701 diff --git a/Software/components/drivers/adau1701/src/FlashDspProgramSource.cpp b/Software/components/drivers/adau1701/src/FlashDspProgramSource.cpp index b9a6d15..308a88d 100644 --- a/Software/components/drivers/adau1701/src/FlashDspProgramSource.cpp +++ b/Software/components/drivers/adau1701/src/FlashDspProgramSource.cpp @@ -18,7 +18,7 @@ #include "esp_log.h" #include "esp_partition.h" -#include +#include #include namespace adau1701 { @@ -75,26 +75,60 @@ FlashDspProgramSource::loadProgram() return std::unexpected(core::DspProgramError::Empty); } - // Partizione non vuota: alloca il backing store con new(nothrow), cosi' - // un OOM ritorna nullptr invece di abortire (nessuna eccezione). - auto* raw = new (std::nothrow) std::uint8_t[part->size]; + // Determine exact blob size by scanning DRAD write records before + // allocating — the full partition (256 KB) exceeds the available heap + // on ESP32-S3, and new(nothrow) still invokes __cxa_allocate_exception + // when exceptions are disabled, causing abort(). + + // Read DRAD header (12 bytes) to get write_count. + constexpr std::size_t kHdrSize = 12U; + std::uint8_t hdr[kHdrSize] = {}; + if (esp_partition_read(part, 0, hdr, kHdrSize) != ESP_OK) { + return std::unexpected(core::DspProgramError::FlashReadFailed); + } + // Quick magic/version check (full validation done by parseDspProgramBlob). + if (hdr[0] != 'D' || hdr[1] != 'R' || hdr[2] != 'A' || hdr[3] != 'D' + || static_cast(hdr[4] | (hdr[5] << 8)) != 1U) { + return std::unexpected(core::DspProgramError::FlashReadFailed); + } + const auto writeCount = + static_cast(hdr[6] | (hdr[7] << 8)); + if (writeCount == 0U || writeCount > 32U) { + return std::unexpected(core::DspProgramError::FlashReadFailed); + } + + // Scan write record headers (4 bytes each) to compute total payload size. + std::size_t payloadSize = 0U; + for (std::uint16_t i = 0U; i < writeCount; ++i) { + std::uint8_t rec[4] = {}; + if (esp_partition_read(part, kHdrSize + payloadSize, rec, 4U) + != ESP_OK) { + return std::unexpected(core::DspProgramError::FlashReadFailed); + } + const auto dataLen = + static_cast(rec[2] | (rec[3] << 8)); + if (dataLen == 0U || dataLen > 16384U) { + return std::unexpected(core::DspProgramError::FlashReadFailed); + } + payloadSize += 4U + dataLen; + } + + const std::size_t totalSize = kHdrSize + payloadSize; + + // Use malloc — avoids C++ exception machinery entirely (no nothrow workaround). + auto* raw = static_cast(::malloc(totalSize)); if (raw == nullptr) { - ESP_LOGE(kTag, "dsp buffer alloc failed (%u byte)", - static_cast(part->size)); + ESP_LOGE(kTag, "dsp buffer alloc failed (%u bytes)", + static_cast(totalSize)); return std::unexpected(core::DspProgramError::FlashReadFailed); } - std::unique_ptr guard(raw); + std::unique_ptr guard(raw, ::free); - if (esp_partition_read(part, 0, raw, part->size) != ESP_OK) { + if (esp_partition_read(part, 0, raw, totalSize) != ESP_OK) { return std::unexpected(core::DspProgramError::FlashReadFailed); } - std::span view(raw, part->size); - if (partitionLooksEmpty(view)) { - return std::unexpected(core::DspProgramError::Empty); - } - - return core::parseDspProgramBlob(view); + return core::parseDspProgramBlob({raw, totalSize}); } std::expected diff --git a/Software/components/drivers/adau1701/src/SigmaStudioFW.c b/Software/components/drivers/adau1701/src/SigmaStudioFW.c index a02e89d..7364376 100644 --- a/Software/components/drivers/adau1701/src/SigmaStudioFW.c +++ b/Software/components/drivers/adau1701/src/SigmaStudioFW.c @@ -14,10 +14,13 @@ #include "SigmaStudioFW.h" #include "driver/i2c_master.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" #include static i2c_master_dev_handle_t s_dev = NULL; +static SemaphoreHandle_t s_lock = NULL; void sigma_studio_bind_i2c(int port, unsigned char addr7) { @@ -28,6 +31,45 @@ void sigma_studio_bind_i2c(int port, unsigned char addr7) void sigma_studio_set_device(void* i2cDevHandle) { s_dev = (i2c_master_dev_handle_t)i2cDevHandle; + if (s_lock == NULL) { + s_lock = xSemaphoreCreateMutex(); + } +} + +void sigma_studio_lock(void) +{ + if (s_lock != NULL) { + xSemaphoreTake(s_lock, portMAX_DELAY); + } +} + +void sigma_studio_unlock(void) +{ + if (s_lock != NULL) { + xSemaphoreGive(s_lock); + } +} + +/* + * The ADAU1701 memory map is word-indexed with a region-dependent word + * width (Param RAM = 4 bytes, Program RAM = 5 bytes, Control regs = + * 2 bytes) — confirmed by DigiRadio's own generated export + * (DigiRadio_IC_1.h: PROGRAM_ADDR_IC_1=1024/PROGRAM_SIZE_IC_1=5120, + * PARAM_ADDR_IC_1=0/PARAM_SIZE_IC_1=4096; DigiRadio_IC_1_REG.h: + * REG_COREREGISTER_IC_1_ADDR=0x81C) and independently by the + * ADAU1701-TCPi-ESP32 reference project's directWrite(). Chunk + * boundaries must land on whole words, or the address advance for the + * next I2C transaction (and the data itself, mid-word) is wrong. + */ +static unsigned int sigmaWordSize(unsigned int address) +{ + if (address >= 0x0400U && address <= 0x07FFU) { + return 5U; + } + if (address >= 0x0800U) { + return 2U; + } + return 4U; } void SIGMA_WRITE_REGISTER_BLOCK(unsigned char devAddress, @@ -40,25 +82,45 @@ void SIGMA_WRITE_REGISTER_BLOCK(unsigned char devAddress, return; } - enum { kChunk = 64U }; + enum { kChunkBytesMax = 64U }; + const unsigned int wordSize = sigmaWordSize(address); + const unsigned int wordsPerChunk = kChunkBytesMax / wordSize; + const unsigned int chunkBytes = wordsPerChunk * wordSize; + unsigned int addr = address; unsigned int remaining = length; ADI_REG_TYPE* cursor = pData; while (remaining > 0U) { const unsigned int chunk = - remaining > kChunk ? kChunk : remaining; - unsigned char buf[2U + 64U]; + remaining > chunkBytes ? chunkBytes : remaining; + const unsigned int words = chunk / wordSize; + unsigned char buf[2U + kChunkBytesMax]; buf[0] = (unsigned char)((addr >> 8) & 0xFFU); buf[1] = (unsigned char)(addr & 0xFFU); memcpy(buf + 2U, cursor, chunk); i2c_master_transmit(s_dev, buf, (size_t)(2U + chunk), 1000); - addr += chunk; + addr += words; cursor += chunk; remaining -= chunk; } } +int sigma_i2c_read(unsigned int reg, unsigned char* data, unsigned int length) +{ + if (s_dev == NULL || data == NULL || length == 0U) { + return -1; + } + + unsigned char addrBuf[2U]; + addrBuf[0] = (unsigned char)((reg >> 8) & 0xFFU); + addrBuf[1] = (unsigned char)(reg & 0xFFU); + + const esp_err_t err = i2c_master_transmit_receive( + s_dev, addrBuf, sizeof(addrBuf), data, (size_t)length, 1000); + return err == ESP_OK ? 0 : -1; +} + static int sigma_i2c_write(unsigned int reg, const unsigned char* data, unsigned char length) { @@ -66,7 +128,7 @@ static int sigma_i2c_write(unsigned int reg, const unsigned char* data, return -1; } - unsigned char buf[2U + 4U]; + unsigned char buf[2U + 5U]; if ((size_t)length + 2U > sizeof(buf)) { return -1; } @@ -78,14 +140,25 @@ static int sigma_i2c_write(unsigned int reg, const unsigned char* data, return err == ESP_OK ? 0 : -1; } +/* + * Safeload Data registers are 5 bytes wide (fixed 0x00 qualifier byte + + * full sign-extended 32-bit value, MSB first) — confirmed against the + * ADAU1701-TCPi-ESP32 reference project's safeloadChunk(), which sends + * the identical 5-byte layout. `fixpoint` is a full-range Q8.23 + * two's-complement value (core::floatToFixpoint823): the previous + * 4-byte payload here dropped the top (sign) byte entirely, silently + * corrupting every negative coefficient (e.g. biquad a1/b1, routinely + * negative for peaking/shelving EQ bands). + */ static int sigma_write_fixpoint_reg(unsigned int reg, int fixpoint) { - unsigned char payload[4U]; + unsigned char payload[5U]; payload[0] = 0U; - payload[1] = (unsigned char)((fixpoint >> 16) & 0xFFU); - payload[2] = (unsigned char)((fixpoint >> 8) & 0xFFU); - payload[3] = (unsigned char)(fixpoint & 0xFFU); - return sigma_i2c_write(reg, payload, 4U); + payload[1] = (unsigned char)(((unsigned int)fixpoint >> 24) & 0xFFU); + payload[2] = (unsigned char)(((unsigned int)fixpoint >> 16) & 0xFFU); + payload[3] = (unsigned char)(((unsigned int)fixpoint >> 8) & 0xFFU); + payload[4] = (unsigned char)((unsigned int)fixpoint & 0xFFU); + return sigma_i2c_write(reg, payload, 5U); } static int sigma_write_param_addr(unsigned int reg, unsigned int paramAddr) @@ -133,3 +206,30 @@ int sigma_safeload_block(unsigned char count, const unsigned int* paramAddrs, return sigma_trigger_safeload(); } + +int sigma_safeload_raw_block(unsigned char count, const unsigned int* paramAddrs, + const unsigned char* rawWords) +{ + if (count == 0U || count > 5U || paramAddrs == NULL || rawWords == NULL) { + return -1; + } + + for (unsigned char i = 0U; i < count; ++i) { + const unsigned int dataReg = + ADAU1701_SAFELOAD_DATA_BASE + (unsigned int)i; + const unsigned int addrReg = + ADAU1701_SAFELOAD_ADDR_BASE + (unsigned int)i; + + unsigned char payload[5U]; + payload[0] = 0U; + memcpy(payload + 1U, rawWords + ((unsigned int)i * 4U), 4U); + if (sigma_i2c_write(dataReg, payload, 5U) != 0) { + return -1; + } + if (sigma_write_param_addr(addrReg, paramAddrs[i]) != 0) { + return -1; + } + } + + return sigma_trigger_safeload(); +} diff --git a/Software/components/drivers/bt1035/include/bt1035/Bt1035Driver.hpp b/Software/components/drivers/bt1035/include/bt1035/Bt1035Driver.hpp index c967d6e..5e02254 100644 --- a/Software/components/drivers/bt1035/include/bt1035/Bt1035Driver.hpp +++ b/Software/components/drivers/bt1035/include/bt1035/Bt1035Driver.hpp @@ -16,6 +16,7 @@ #include "core/Bt1035At.hpp" +#include #include #include #include @@ -36,8 +37,6 @@ namespace bt1035 { struct Bt1035Pins { int uartTx; ///< ESP32 TX -> module RX. int uartRx; ///< ESP32 RX <- module TX. - int rtsGpio; ///< RTS (flow control). - int ctsGpio; ///< CTS (flow control). int resetGpio; ///< Module RESET (active level per schematic). int sysCtlGpio; ///< SYS_CTL (optional module enable). }; @@ -48,7 +47,7 @@ struct Bt1035Pins { * @dname Bt1035Driver * @return n/a (type) * @pubstate Owns UART port after boot(). booted_ true after init sequence - * including AT+AUXCFG=3 and AT+I2SCFG=67 (I2S slave from ADAU1701). + * including AT+AUXCFG=3 and AT+I2SCFG=35 (I2S slave from ADAU1701). * * @author Michele Bigi * @date 2026-07-06 @@ -159,6 +158,22 @@ public: [[nodiscard]] std::expected queryA2dpState(); + /** + * @brief queryA2dpEncoder — read negotiated A2DP codec (AT+A2DPENC). + * + * @dname queryA2dpEncoder + * @return Parsed codec on success, or Bt1035Error. Failing here while + * queryA2dpState() reports Streaming means the module has a + * link but is not actually encoding audio — a real fault, + * not just a quiet source. + * @pubstate writes UART; parses +A2DPENC from the reply. + * + * @author Michele Bigi + * @date 2026-08-07 + */ + [[nodiscard]] std::expected + queryA2dpEncoder(); + /** * @brief disconnectA2dp — release the active A2DP session (AT+A2DPDISC). * @@ -236,15 +251,115 @@ public: [[nodiscard]] std::expected, Bt1035Error> queryPairedList(); + /** + * @brief scanNearbyBrEdr — inquiry for nearby A2DP sink devices. + * + * @dname scanNearbyBrEdr + * @param scanSeconds BR/EDR scan duration 1–255 (default 20 in service). + * @return Parsed +SCAN entries, or Bt1035Error. + * @pubstate sends AT+SCAN=1,n and collects until +SCAN=E. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] std::expected, Bt1035Error> + scanNearbyBrEdr(std::uint8_t scanSeconds = 20U); + + /** + * @brief stopScan — abort an active AT+SCAN inquiry. + * + * @dname stopScan + * @return Ok on success, or Bt1035Error. + * @pubstate sends AT+SCAN=0. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] std::expected stopScan(); + + /** + * @brief prepareForOutgoingConnect — disable auto-link before A2DPCONN. + * + * @dname prepareForOutgoingConnect + * @pubstate sends LINKCFG/AUTOCONN off; does not clear PLIST. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + void prepareForOutgoingConnect(); + + /** + * @brief waitForA2dpConnected — poll until A2DP link is up. + * + * @dname waitForA2dpConnected + * @param timeoutMs Maximum wait in milliseconds. + * @return true when Connected/Streaming/Paused, false on timeout. + * @pubstate polls AT+A2DPSTAT. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] bool waitForA2dpConnected(int timeoutMs); + + /** + * @brief startA2dpAudio — send AT+A2DPAUDIO=1 (Feasycom §5.3.6). + * + * @dname startA2dpAudio + * @return Ok on module OK, or Bt1035Error. + * @pubstate writes UART. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] std::expected startA2dpAudio(); + + /** + * @brief waitForA2dpStreaming — poll until +A2DPSTAT=4 (Streaming). + * + * @dname waitForA2dpStreaming + * @param timeoutMs Maximum wait in milliseconds. + * @return true when Streaming, false on timeout. + * @pubstate polls AT+A2DPSTAT; sends A2DPAUDIO=1 when stuck at Connected. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] bool waitForA2dpStreaming(int timeoutMs); + + /** + * @brief connectA2dp — pair/connect to a remote by MAC (AT+A2DPCONN). + * + * @dname connectA2dp + * @param mac 12-char ASCII MAC from scan results. + * @return Ok on success, or Bt1035Error. + * @pubstate may take several seconds while the module pairs. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] std::expected connectA2dp( + std::string_view mac); + private: [[nodiscard]] std::expected ensureBooted() const; [[nodiscard]] std::expected runInitSequence(); [[nodiscard]] std::expected transmitAndCollect( std::string_view commandLine, int timeoutMs = kResponseTimeoutMs); + [[nodiscard]] std::expected transmitAndCollectUntil( + std::string_view commandLine, std::string_view endMarker, int timeoutMs, + std::uint8_t minScanSeconds = 0U); [[nodiscard]] std::expected transmitAndExpectOk( std::string_view commandLine); + [[nodiscard]] std::expected transmitAndExpectOkLogged( + std::string_view label, std::string_view commandLine); + + void prepareForInquiryScan(); + [[nodiscard]] bool waitForA2dpIdle(int timeoutMs); + [[nodiscard]] std::expected, Bt1035Error> + runInquiryScan(std::uint8_t scanType, std::uint8_t scanSeconds); static constexpr int kResponseTimeoutMs = 2000; + static constexpr int kConnectTimeoutMs = 15000; Bt1035Pins pins_; bool booted_; diff --git a/Software/components/drivers/bt1035/src/Bt1035Driver.cpp b/Software/components/drivers/bt1035/src/Bt1035Driver.cpp index f87d684..285dd76 100644 --- a/Software/components/drivers/bt1035/src/Bt1035Driver.cpp +++ b/Software/components/drivers/bt1035/src/Bt1035Driver.cpp @@ -13,6 +13,7 @@ #include "bt1035/Bt1035Driver.hpp" +#include "core/Bt1035ScannedDevice.hpp" #include "driver/gpio.h" #include "driver/uart.h" #include "esp_log.h" @@ -20,6 +21,8 @@ #include "freertos/task.h" #include +#include +#include #include #include #include @@ -30,11 +33,218 @@ namespace { constexpr char kTag[] = "Bt1035"; constexpr int kUartPort = 2; constexpr int kBaudRate = 115200; -constexpr int kUartRxBuffer = 512; +constexpr int kUartRxBuffer = 4096; constexpr int kUartTxBuffer = 256; constexpr int kResponseTimeoutMs = 2000; constexpr int kPostResetMs = 500; constexpr int kPostUartMs = 100; + +void flushUartRx(int uartPort) noexcept +{ + uart_flush_input(static_cast(uartPort)); + std::array discard{}; + while (uart_read_bytes(static_cast(uartPort), discard.data(), + discard.size(), 0) + > 0) { + } +} + +constexpr int kBrEdrScanTimeoutMs = 90000; +constexpr int kScanProgressLogMs = 5000; +constexpr int kScanIdleCompleteMs = 4000; +constexpr int kDefaultScanListenSeconds = 25; +constexpr unsigned long kDevStatScanComplete = 1U; + +void logAtLine(std::string_view label, std::string_view line) noexcept +{ + std::string sanitized; + sanitized.reserve(line.size()); + for (const char ch : line) { + if (ch == '\r') { + sanitized.append("\\r"); + } else if (ch == '\n') { + sanitized.append("\\n"); + } else if (ch >= 0x20 && ch < 0x7F) { + sanitized.push_back(ch); + } else { + sanitized.push_back('.'); + } + } + ESP_LOGI(kTag, "%.*s: %s", static_cast(label.size()), label.data(), + sanitized.c_str()); +} + +[[nodiscard]] bool responseHasScanEnd(std::string_view response) noexcept +{ + return response.find("+SCAN=E") != std::string_view::npos + || response.find("+SCAN= E") != std::string_view::npos + || response.find("+SCAN=END") != std::string_view::npos + || response.find("+SCAN= END") != std::string_view::npos; +} + +[[nodiscard]] bool responseHasScanEntries(std::string_view response) noexcept +{ + return response.find("+SCAN=") != std::string_view::npos + || response.find("+SCAN =") != std::string_view::npos; +} + +[[nodiscard]] bool responseHasDevStatScanComplete( + std::string_view response) noexcept +{ + if (!responseHasScanEntries(response)) { + return false; + } + constexpr std::string_view kPrefix = "+DEVSTAT="; + std::size_t pos = 0; + unsigned long lastValue = 0U; + bool found = false; + while ((pos = response.find(kPrefix, pos)) != std::string_view::npos) { + const std::size_t start = pos + kPrefix.size(); + char* end = nullptr; + const unsigned long raw = + std::strtoul(response.data() + start, &end, 10); + if (end != response.data() + start) { + lastValue = raw; + found = true; + } + pos = start + 1U; + } + return found && lastValue == kDevStatScanComplete; +} + +[[nodiscard]] std::size_t countScanEntries(std::string_view response) noexcept +{ + std::size_t count = 0U; + std::size_t pos = 0; + while ((pos = response.find("+SCAN=", pos)) != std::string_view::npos) { + const std::size_t valueStart = pos + 6U; + if (valueStart < response.size() && response[valueStart] != 'E') { + ++count; + } + pos = valueStart + 1U; + } + return count; +} + +enum class ScanCollectReason { + EndMarker, + DevStatComplete, + IdleAfterScan, + TimeoutPartial, +}; + +[[nodiscard]] bool scanCollectionShouldStop(std::string_view response, + std::size_t scanEntryCount, + TickType_t lastRxTick, + TickType_t now, + TickType_t started, + std::uint8_t minScanSeconds, + ScanCollectReason* reason) noexcept +{ + if (!response.empty() && responseHasScanEnd(response)) { + if (reason != nullptr) { + *reason = ScanCollectReason::EndMarker; + } + return true; + } + + const int elapsedMs = static_cast(pdTICKS_TO_MS(now - started)); + const int minListenMs = + minScanSeconds > 0U + ? static_cast(minScanSeconds) * 1000 + : kDefaultScanListenSeconds * 1000; + const bool minListenElapsed = elapsedMs >= minListenMs; + + if (minListenElapsed && responseHasDevStatScanComplete(response)) { + if (reason != nullptr) { + *reason = ScanCollectReason::DevStatComplete; + } + return true; + } + if (minListenElapsed && scanEntryCount > 0U && lastRxTick > 0U + && (now - lastRxTick) >= pdMS_TO_TICKS(kScanIdleCompleteMs)) { + if (reason != nullptr) { + *reason = ScanCollectReason::IdleAfterScan; + } + return true; + } + return false; +} + +void logScanRawPayload(std::string_view label, std::string_view response) noexcept +{ + if (response.empty()) { + ESP_LOGI(kTag, "%.*s (0 bytes)", static_cast(label.size()), + label.data()); + return; + } + std::string sanitized; + sanitized.reserve(std::min(response.size(), std::size_t{512U})); + for (const char ch : response) { + if (ch == '\r') { + sanitized.append("\\r"); + } else if (ch == '\n') { + sanitized.append("\\n"); + } else if (ch >= 0x20 && ch < 0x7F) { + sanitized.push_back(ch); + } else { + sanitized.push_back('.'); + } + } + constexpr std::size_t kChunk = 480U; + if (sanitized.size() <= kChunk) { + ESP_LOGI(kTag, "%.*s (%d bytes): %s", + static_cast(label.size()), label.data(), + static_cast(response.size()), sanitized.c_str()); + return; + } + ESP_LOGI(kTag, "%.*s (%d bytes, part 1/%u): %.*s", + static_cast(label.size()), label.data(), + static_cast(response.size()), + static_cast( + (sanitized.size() + kChunk - 1U) / kChunk), + static_cast(kChunk), sanitized.c_str()); + for (std::size_t off = kChunk; off < sanitized.size(); off += kChunk) { + const std::size_t len = std::min(kChunk, sanitized.size() - off); + ESP_LOGI(kTag, "%.*s (cont %u): %.*s", + static_cast(label.size()), label.data(), + static_cast(off / kChunk + 1U), + static_cast(len), sanitized.c_str() + off); + } +} + +void logScanUartChunk(int received, std::string_view chunk) noexcept +{ + const std::string label = "scan UART RX +" + std::to_string(received); + logScanRawPayload(label, chunk); +} + +[[nodiscard]] const char* scanCollectReasonLabel( + ScanCollectReason reason) noexcept +{ + switch (reason) { + case ScanCollectReason::EndMarker: + return "+SCAN=E/end marker"; + case ScanCollectReason::DevStatComplete: + return "+DEVSTAT=1"; + case ScanCollectReason::IdleAfterScan: + return "UART idle after +SCAN"; + case ScanCollectReason::TimeoutPartial: + return "timeout"; + } + return "unknown"; +} + +void logScanParsedDevice(const core::Bt1035ScannedDevice& device) noexcept +{ + ESP_LOGI(kTag, + "scan device[%u]: mac=%s name=%s rssi=%d dBm class=%s addrType=%u", + static_cast(device.index), device.mac.c_str(), + device.name.empty() ? "(no name)" : device.name.c_str(), + static_cast(device.rssiDbm), + device.deviceClass.empty() ? "-" : device.deviceClass.c_str(), + static_cast(device.addressType)); +} } // namespace Bt1035Driver::Bt1035Driver(Bt1035Pins pins) @@ -102,6 +312,284 @@ std::expected Bt1035Driver::transmitAndCollect( return std::unexpected(Bt1035Error::AtTimeout); } +std::expected Bt1035Driver::transmitAndCollectUntil( + std::string_view commandLine, std::string_view endMarker, int timeoutMs, + std::uint8_t minScanSeconds) +{ + logAtLine("scan UART TX", commandLine); + + const int written = uart_write_bytes(static_cast(uartPort_), + commandLine.data(), + commandLine.size()); + if (written < 0 + || static_cast(written) != commandLine.size()) { + ESP_LOGE(kTag, "scan UART TX failed (%d)", written); + return std::unexpected(Bt1035Error::UartInitFailed); + } + + std::array buffer{}; + std::string accumulated; + accumulated.reserve(8192U); + const TickType_t started = xTaskGetTickCount(); + const TickType_t deadline = started + pdMS_TO_TICKS(timeoutMs); + TickType_t lastProgressLog = started; + TickType_t lastRxTick = 0; + std::size_t scanEntryCount = 0U; + ScanCollectReason stopReason = ScanCollectReason::TimeoutPartial; + bool stoppedEarly = false; + + ESP_LOGI(kTag, "======== BT scan inquiry begin (min %u s, timeout %d ms) ========", + static_cast(minScanSeconds), timeoutMs); + + while (xTaskGetTickCount() < deadline) { + const int received = uart_read_bytes(static_cast(uartPort_), + buffer.data(), buffer.size(), + pdMS_TO_TICKS(200)); + const TickType_t now = xTaskGetTickCount(); + if (received > 0) { + const std::string_view chunk(buffer.data(), + static_cast(received)); + logScanUartChunk(received, chunk); + accumulated.append(buffer.data(), static_cast(received)); + lastRxTick = now; + + const std::size_t updatedScanCount = + countScanEntries(accumulated); + if (updatedScanCount > scanEntryCount) { + ESP_LOGI(kTag, "scan +SCAN entry #%u (total %u)", + static_cast(updatedScanCount), + static_cast(updatedScanCount)); + scanEntryCount = updatedScanCount; + } + + if (!endMarker.empty() + && accumulated.find(endMarker) != std::string::npos) { + stopReason = ScanCollectReason::EndMarker; + stoppedEarly = true; + ESP_LOGI(kTag, "scan end marker %.*s seen", + static_cast(endMarker.size()), endMarker.data()); + break; + } + if (scanCollectionShouldStop(accumulated, scanEntryCount, lastRxTick, + now, started, minScanSeconds, + &stopReason)) { + stoppedEarly = true; + if (stopReason == ScanCollectReason::EndMarker) { + ESP_LOGI(kTag, "scan end marker +SCAN=E seen"); + } else if (stopReason == ScanCollectReason::DevStatComplete) { + ESP_LOGI(kTag, + "scan complete: +DEVSTAT=1 after %u +SCAN entr(ies)", + static_cast(scanEntryCount)); + } + break; + } + if (core::parseBt1035AtResponse(accumulated) + == core::Bt1035AtResponseKind::Error) { + logScanRawPayload("scan ERROR response", accumulated); + return std::unexpected(Bt1035Error::AtError); + } + } else if (scanEntryCount > 0U + && scanCollectionShouldStop(accumulated, scanEntryCount, + lastRxTick, now, started, + minScanSeconds, &stopReason)) { + stoppedEarly = true; + if (stopReason == ScanCollectReason::IdleAfterScan) { + ESP_LOGI(kTag, + "scan complete: idle %d ms after last +SCAN (%u entr(ies))", + kScanIdleCompleteMs, + static_cast(scanEntryCount)); + } + break; + } + + if ((now - lastProgressLog) >= pdMS_TO_TICKS(kScanProgressLogMs)) { + lastProgressLog = now; + const int elapsedMs = + static_cast(pdTICKS_TO_MS(now - started)); + const int minListenMs = + minScanSeconds > 0U + ? static_cast(minScanSeconds) * 1000 + : kDefaultScanListenSeconds * 1000; + ESP_LOGI(kTag, + "scan progress: %d ms, %d bytes rx, %u +SCAN, min listen %d ms", + elapsedMs, static_cast(accumulated.size()), + static_cast(scanEntryCount), minListenMs); + } + } + + const int elapsedMs = + static_cast(pdTICKS_TO_MS(xTaskGetTickCount() - started)); + if (stoppedEarly) { + ESP_LOGI(kTag, "scan stopped: reason=%s, elapsed=%d ms, %u +SCAN entr(ies)", + scanCollectReasonLabel(stopReason), elapsedMs, + static_cast(scanEntryCount)); + } else { + stopReason = ScanCollectReason::TimeoutPartial; + ESP_LOGW(kTag, "scan stopped: reason=%s, elapsed=%d ms, %u +SCAN entr(ies)", + scanCollectReasonLabel(stopReason), elapsedMs, + static_cast(scanEntryCount)); + } + logScanRawPayload("scan UART full RX", accumulated); + + const bool hasEnd = stoppedEarly + || (!endMarker.empty() + ? accumulated.find(endMarker) + != std::string::npos + : responseHasScanEnd(accumulated)); + if (!hasEnd) { + if (!responseHasScanEntries(accumulated)) { + if (accumulated.find("+A2DPSTAT=2") != std::string_view::npos) { + ESP_LOGW(kTag, + "scan blocked: module auto-connecting A2DP (disable LINKCFG)"); + } + if (accumulated.find("+DEVSTAT=") != std::string_view::npos) { + ESP_LOGW(kTag, "scan saw DEVSTAT events but no +SCAN= lines"); + } + ESP_LOGW(kTag, "scan timeout (%d bytes rx, no +SCAN entries)", + static_cast(accumulated.size())); + (void)transmitAndCollect(core::buildBt1035StopScanLine(), 1000); + return std::unexpected(Bt1035Error::AtTimeout); + } + ESP_LOGW(kTag, "scan timeout but %d bytes contain +SCAN entries — parsing partial", + static_cast(accumulated.size())); + } + + ESP_LOGI(kTag, "======== BT scan inquiry end ========"); + return accumulated; +} + +std::expected Bt1035Driver::transmitAndExpectOkLogged( + std::string_view label, std::string_view commandLine) +{ + logAtLine(label, commandLine); + auto collected = transmitAndCollect(commandLine); + if (collected) { + if (!collected->empty()) { + const std::string rxLabel = std::string(label) + " RX"; + logScanRawPayload(rxLabel, *collected); + } + ESP_LOGI(kTag, "%.*s: OK", static_cast(label.size()), label.data()); + return {}; + } + if (collected.error() == Bt1035Error::AtTimeout) { + ESP_LOGW(kTag, "%.*s: timeout (no response)", static_cast(label.size()), + label.data()); + } else { + ESP_LOGW(kTag, "%.*s: failed (%d)", static_cast(label.size()), + label.data(), static_cast(collected.error())); + } + return std::unexpected(collected.error()); +} + +void Bt1035Driver::prepareForInquiryScan() +{ + ESP_LOGI(kTag, "======== BT scan prep begin ========"); + flushUartRx(uartPort_); + (void)transmitAndExpectOkLogged("scan prep PRINT", + core::buildBt1035EnablePrintLine()); + (void)transmitAndExpectOkLogged("scan prep LINKCFG off", + core::buildBt1035DisableAutoLinkLine()); + (void)transmitAndExpectOkLogged("scan prep AUTOCONN off", + core::buildBt1035SetAutoConnLine(0U)); + (void)transmitAndExpectOkLogged("scan prep PLIST clear", + core::buildBt1035ClearPairedListLine()); + (void)transmitAndExpectOkLogged( + "scan prep A2DPDISC", + core::buildBt1035AtLine(core::Bt1035AtCommand::A2dpDisconnect)); + (void)transmitAndExpectOkLogged("scan prep DSCA", + core::buildBt1035DisconnectAllLine()); + (void)transmitAndExpectOkLogged( + "scan prep PAIR=0", + core::buildBt1035AtLine(core::Bt1035AtCommand::PairHidden)); + auto stopScan = transmitAndCollect(core::buildBt1035StopScanLine(), 1000); + if (stopScan) { + logScanRawPayload("scan prep SCAN=0 RX", *stopScan); + ESP_LOGI(kTag, "scan prep SCAN=0: OK"); + } else { + ESP_LOGI(kTag, "scan prep SCAN=0: skipped (no active scan)"); + } + flushUartRx(uartPort_); + vTaskDelay(pdMS_TO_TICKS(500)); + if (!waitForA2dpIdle(10000)) { + ESP_LOGW(kTag, "scan prep: A2DP still busy — continuing anyway"); + } + if (auto paired = queryPairedList(); paired && !paired->empty()) { + ESP_LOGI(kTag, "scan prep: %u paired device(s) on module", + static_cast(paired->size())); + for (const core::Bt1035PairedDevice& entry : *paired) { + ESP_LOGI(kTag, "scan prep paired: %s (%s)", + entry.mac.c_str(), + entry.name.empty() ? "(no name)" : entry.name.c_str()); + } + } + flushUartRx(uartPort_); + ESP_LOGI(kTag, "======== BT scan prep end ========"); +} + +bool Bt1035Driver::waitForA2dpIdle(int timeoutMs) +{ + const TickType_t deadline = + xTaskGetTickCount() + pdMS_TO_TICKS(timeoutMs); + TickType_t lastDisconnectAttempt = 0; + while (xTaskGetTickCount() < deadline) { + auto state = queryA2dpState(); + if (!state) { + ESP_LOGW(kTag, "scan prep: A2DPSTAT query failed"); + return false; + } + ESP_LOGI(kTag, "scan prep: A2DPSTAT=%u", + static_cast(static_cast(*state))); + if (*state == core::Bt1035A2dpState::Standby + || *state == core::Bt1035A2dpState::Unsupported) { + return true; + } + const TickType_t now = xTaskGetTickCount(); + if ((now - lastDisconnectAttempt) >= pdMS_TO_TICKS(1500)) { + lastDisconnectAttempt = now; + ESP_LOGW(kTag, "scan prep: A2DP busy — sending A2DPDISC+DSCA"); + (void)transmitAndExpectOk( + core::buildBt1035AtLine(core::Bt1035AtCommand::A2dpDisconnect)); + (void)transmitAndExpectOk(core::buildBt1035DisconnectAllLine()); + flushUartRx(uartPort_); + } + vTaskDelay(pdMS_TO_TICKS(400)); + } + return false; +} + +std::expected, Bt1035Error> +Bt1035Driver::runInquiryScan(std::uint8_t scanType, std::uint8_t scanSeconds) +{ + const std::string startLine = + core::buildBt1035StartScanLine(scanType, scanSeconds); + const int timeoutMs = scanSeconds == 0U + ? kBrEdrScanTimeoutMs + : static_cast(scanSeconds) * 1000 + 30000; + flushUartRx(uartPort_); + ESP_LOGI(kTag, "scan inquiry: type=%u seconds=%u timeout=%d ms", + static_cast(scanType), + static_cast(scanSeconds), timeoutMs); + auto response = transmitAndCollectUntil(startLine, {}, timeoutMs, scanSeconds); + if (!response) { + ESP_LOGW(kTag, "scan inquiry failed (type %u)", + static_cast(scanType)); + return std::unexpected(response.error()); + } + + auto parsed = core::parseBt1035ScanResponse(*response); + if (!parsed) { + ESP_LOGW(kTag, "scan parse failed (type %u)", + static_cast(scanType)); + return std::unexpected(Bt1035Error::UnexpectedResponse); + } + ESP_LOGI(kTag, "scan parsed %u device(s)", + static_cast(parsed->size())); + for (const core::Bt1035ScannedDevice& device : *parsed) { + logScanParsedDevice(device); + } + return *parsed; +} + std::expected Bt1035Driver::transmitAndExpectOk( std::string_view commandLine) { @@ -156,6 +644,25 @@ std::expected Bt1035Driver::queryA2dpState() return *parsed; } +std::expected Bt1035Driver::queryA2dpEncoder() +{ + if (auto ready = ensureBooted(); !ready) { + return std::unexpected(ready.error()); + } + + auto response = transmitAndCollect( + core::buildBt1035AtLine(core::Bt1035AtCommand::A2dpEncoder)); + if (!response) { + return std::unexpected(response.error()); + } + + auto parsed = core::parseBt1035A2dpEncoderResponse(*response); + if (!parsed) { + return std::unexpected(Bt1035Error::UnexpectedResponse); + } + return *parsed; +} + std::expected Bt1035Driver::disconnectA2dp() { if (auto ready = ensureBooted(); !ready) { @@ -243,6 +750,133 @@ Bt1035Driver::queryPairedList() return *parsed; } +std::expected, Bt1035Error> +Bt1035Driver::scanNearbyBrEdr(std::uint8_t scanSeconds) +{ + if (auto ready = ensureBooted(); !ready) { + return std::unexpected(ready.error()); + } + + ESP_LOGI(kTag, "======== BT scan session begin (%u s) ========", + static_cast(scanSeconds)); + + prepareForInquiryScan(); + + auto result = runInquiryScan(1U, scanSeconds); + + ESP_LOGI(kTag, "scan post-cleanup: A2DPDISC+DSCA+SCAN=0"); + (void)transmitAndExpectOkLogged( + "scan post A2DPDISC", + core::buildBt1035AtLine(core::Bt1035AtCommand::A2dpDisconnect)); + (void)transmitAndExpectOkLogged("scan post DSCA", + core::buildBt1035DisconnectAllLine()); + (void)transmitAndExpectOkLogged("scan post SCAN=0", + core::buildBt1035StopScanLine()); + + if (result) { + ESP_LOGI(kTag, "======== BT scan session OK: %u device(s) ========", + static_cast(result->size())); + } else { + ESP_LOGW(kTag, "======== BT scan session FAILED ========"); + } + + return result; +} + +std::expected Bt1035Driver::stopScan() +{ + if (auto ready = ensureBooted(); !ready) { + return ready; + } + return transmitAndExpectOk(core::buildBt1035StopScanLine()); +} + +void Bt1035Driver::prepareForOutgoingConnect() +{ + ESP_LOGI(kTag, "connect prep: LINKCFG/AUTOCONN off"); + (void)transmitAndExpectOk(core::buildBt1035DisableAutoLinkLine()); + (void)transmitAndExpectOk(core::buildBt1035SetAutoConnLine(0U)); + flushUartRx(uartPort_); +} + +bool Bt1035Driver::waitForA2dpConnected(int timeoutMs) +{ + const TickType_t deadline = + xTaskGetTickCount() + pdMS_TO_TICKS(timeoutMs); + while (xTaskGetTickCount() < deadline) { + auto state = queryA2dpState(); + if (!state) { + return false; + } + ESP_LOGI(kTag, "connect wait: A2DPSTAT=%u", + static_cast(static_cast(*state))); + if (*state == core::Bt1035A2dpState::Connected + || *state == core::Bt1035A2dpState::Streaming + || *state == core::Bt1035A2dpState::Paused) { + return true; + } + vTaskDelay(pdMS_TO_TICKS(500)); + } + return false; +} + +std::expected Bt1035Driver::startA2dpAudio() +{ + if (auto ready = ensureBooted(); !ready) { + return ready; + } + ESP_LOGI(kTag, "A2DP audio start (AT+A2DPAUDIO=1)"); + return transmitAndExpectOk(core::buildBt1035A2dpAudioLine(true)); +} + +bool Bt1035Driver::waitForA2dpStreaming(int timeoutMs) +{ + const TickType_t deadline = + xTaskGetTickCount() + pdMS_TO_TICKS(timeoutMs); + TickType_t lastAudioStartAttempt = 0; + while (xTaskGetTickCount() < deadline) { + auto state = queryA2dpState(); + if (state) { + ESP_LOGI(kTag, "stream wait: A2DPSTAT=%u", + static_cast(static_cast(*state))); + if (*state == core::Bt1035A2dpState::Streaming) { + return true; + } + const TickType_t now = xTaskGetTickCount(); + if ((*state == core::Bt1035A2dpState::Connected + || *state == core::Bt1035A2dpState::Paused) + && (lastAudioStartAttempt == 0U + || (now - lastAudioStartAttempt) >= pdMS_TO_TICKS(3000))) { + lastAudioStartAttempt = now; + if (auto started = startA2dpAudio(); !started) { + ESP_LOGW(kTag, "A2DPAUDIO=1 failed (%d)", + static_cast(started.error())); + } + } + } + vTaskDelay(pdMS_TO_TICKS(500)); + } + return false; +} + +std::expected Bt1035Driver::connectA2dp(std::string_view mac) +{ + if (auto ready = ensureBooted(); !ready) { + return ready; + } + prepareForOutgoingConnect(); + const std::string line = core::buildBt1035A2dpConnectLine(mac); + if (line.empty()) { + return std::unexpected(Bt1035Error::UnexpectedResponse); + } + (void)stopScan(); + auto response = transmitAndCollect(line, kConnectTimeoutMs); + if (!response) { + return std::unexpected(response.error()); + } + return {}; +} + std::expected Bt1035Driver::runInitSequence() { for (const core::Bt1035AtCommand command : core::bootInitSequence()) { @@ -314,13 +948,24 @@ std::expected Bt1035Driver::boot() uart_flush_input(static_cast(uartPort_)); vTaskDelay(pdMS_TO_TICKS(kPostUartMs)); + // Best-effort: not gated on OK — some Feasycom firmware acks before + // rebooting, some resets silently. Either way, settle and flush before + // the mandatory init sequence below, which IS gated. + (void)transmitAndExpectOk(core::buildBt1035AtLine(core::Bt1035AtCommand::Reset)); + vTaskDelay(pdMS_TO_TICKS(kPostResetMs)); + uart_flush_input(static_cast(uartPort_)); + ESP_LOGI(kTag, "AT+RESET sent"); + if (auto init = runInitSequence(); !init) { ESP_LOGE(kTag, "AT init failed"); return init; } + (void)transmitAndExpectOk(core::buildBt1035DisableAutoLinkLine()); + ESP_LOGI(kTag, "auto-link disabled (AT+LINKCFG=0,0)"); + booted_ = true; - ESP_LOGI(kTag, "I2S slave mode enabled (AT+AUXCFG=3, AT+I2SCFG=67)"); + ESP_LOGI(kTag, "I2S slave mode enabled (AT+AUXCFG=3, AT+I2SCFG=35)"); return {}; } diff --git a/Software/components/drivers/si4684/include/si4684/Si4684Driver.hpp b/Software/components/drivers/si4684/include/si4684/Si4684Driver.hpp index 927ce3e..9fab7f1 100644 --- a/Software/components/drivers/si4684/include/si4684/Si4684Driver.hpp +++ b/Software/components/drivers/si4684/include/si4684/Si4684Driver.hpp @@ -106,14 +106,21 @@ public: * rail ramp before app_main runs. * * @dname boot - * @param band DAB or FM application to load. + * @param band DAB or FM application to load. + * @param xtalIbias POWER_UP ARG3 IBIAS, 10 uA steps (AN649 §Command + * 0x01); default matches the values already + * verified live (72 = 720 uA startup bias). + * @param xtalCtun POWER_UP ARG8 CTUN, 0-63 (AN649 §Command 0x01); + * default matches the values already verified live. * @return Ok on success, or Si4684Error. * @pubstate writes booted_ and loadedBand_ on success. * * @author Michele Bigi * @date 2026-07-06 */ - [[nodiscard]] std::expected boot(Si4684Band band); + [[nodiscard]] std::expected boot( + Si4684Band band, std::uint8_t xtalIbias = 72U, + std::uint8_t xtalCtun = 31U); /** * @brief isBooted — query whether boot completed successfully. @@ -387,7 +394,10 @@ private: [[nodiscard]] std::expected ensureBand( Si4684Band band) const; [[nodiscard]] std::expected waitCts(); - [[nodiscard]] std::expected waitStc(); + [[nodiscard]] std::expected waitStc( + int maxRetries = 250); + [[nodiscard]] std::expected pollStc(); + [[nodiscard]] std::expected clearFmStc(); [[nodiscard]] std::expected sendCommand( std::span bytes); [[nodiscard]] std::expected readRaw( diff --git a/Software/components/drivers/si4684/include/si4684/Si4684Tuner.hpp b/Software/components/drivers/si4684/include/si4684/Si4684Tuner.hpp index a5ed82f..2342037 100644 --- a/Software/components/drivers/si4684/include/si4684/Si4684Tuner.hpp +++ b/Software/components/drivers/si4684/include/si4684/Si4684Tuner.hpp @@ -190,10 +190,25 @@ private: */ [[nodiscard]] static core::TunerError mapError(Si4684Error error) noexcept; + /** + * @brief ensureBandLoaded — HOST_LOAD FM/DAB image when band differs. + * + * @dname ensureBandLoaded + * @param band Required application band for the next operation. + * @return Ok when the chip runs the requested image. + * @pubstate may reload firmware (~1 s) and stop an active DAB service. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] std::expected ensureBandLoaded( + core::TunerBand band); + Si4684Driver& driver_; std::uint8_t dabIndex_; core::FrequencyKHz fmFrequency_; std::uint8_t volume_; + bool fmBandReady_; core::RdsMetadataAccumulator rdsMetadata_; core::DabDynamicLabelAccumulator dabDynamicLabel_; std::optional lastDabServiceId_; diff --git a/Software/components/drivers/si4684/include/si4684/Si4684Types.hpp b/Software/components/drivers/si4684/include/si4684/Si4684Types.hpp index 26629f8..b0724fe 100644 --- a/Software/components/drivers/si4684/include/si4684/Si4684Types.hpp +++ b/Software/components/drivers/si4684/include/si4684/Si4684Types.hpp @@ -18,6 +18,7 @@ #include #include #include +#include #include namespace si4684 { @@ -91,11 +92,11 @@ struct Si4684SysState { * @date 2026-07-06 */ struct Si4684FmRsq { - core::FrequencyKHz frequency; ///< Tuned centre frequency in kHz. - std::int8_t rssiDbuV; ///< RSSI in dBµV. - std::int8_t snrDb; ///< SNR in dB. - bool valid; ///< RSQ valid flag from the chip. - bool stereo; ///< Stereo pilot detected. + std::optional frequency; ///< READFREQ when in FM band. + std::int8_t rssiDbuV; ///< RSSI in dBµV. + std::int8_t snrDb; ///< SNR in dB. + bool valid; ///< RSQ valid flag from the chip. + bool stereo; ///< Stereo pilot detected. }; /** diff --git a/Software/components/drivers/si4684/src/Si4684Driver.cpp b/Software/components/drivers/si4684/src/Si4684Driver.cpp index fc4d704..3f65b7c 100644 --- a/Software/components/drivers/si4684/src/Si4684Driver.cpp +++ b/Software/components/drivers/si4684/src/Si4684Driver.cpp @@ -35,15 +35,58 @@ constexpr int kCtsPollMs = 2; constexpr int kCtsRetries = 5000; constexpr int kStcRetries = 250; constexpr int kStcPollMs = 20; +/** SPI readRaw: byte 0 is a lead-in; STATUS0 is at index 1 (AN649). */ +constexpr std::size_t kSpiReplyLeadIn = 1U; +/** FM_RSQ_STATUS field indices with kSpiReplyLeadIn (AN649 RESP5–10). */ +constexpr std::size_t kFmRsqOffValid = 6U; +constexpr std::size_t kFmRsqOffReadFreq = 7U; +constexpr std::size_t kFmRsqOffRssi = 10U; +constexpr std::size_t kFmRsqOffSnr = 11U; constexpr std::uint16_t kPropDigitalIoOutputSelect = 0x0200U; +constexpr std::uint16_t kPropDigitalIoOutputFormat = 0x0202U; constexpr std::uint16_t kPropDigitalIoSampleRate = 0x0201U; +/** I2S slave — ADAU1701 is bus master (AN649 property 0x0200, bit15=0). */ +constexpr std::uint16_t kSi4684I2sSlaveSelect = 0x0000U; +/** 24-bit samples in 32-bit I2S slots (SAMPL=0x18, SLOT=0x7, I2S mode). */ +constexpr std::uint16_t kSi4684I2sOutputFormat = 0x1870U; +/** 48000 Hz — matches ADAU1701 48 kHz master clock domain. */ +constexpr std::uint16_t kSi4684I2sSampleRateHz = 0xBB80U; constexpr std::uint16_t kPropPinConfigEnable = 0x0800U; constexpr std::uint16_t kPropAudioVolume = 0x0300U; +constexpr std::uint16_t kPropAudioMute = 0x0301U; +constexpr std::uint16_t kPropAudioOutputConfig = 0x0302U; +/** AN649 AUDIO_OUTPUT_CONFIG bit1 I2SOUTEN — required for I2S to ADAU1701. */ +constexpr std::uint16_t kSi4684I2sOutEnable = 0x0002U; +/** Si4684 volume: 0=mute, 63=max (AN649 AUDIO_ANALOG_VOLUME). */ +constexpr std::uint8_t kSi4684VolumeMax = 63U; constexpr std::uint16_t kPropFmRdsConfig = 0x3C02U; +/** AN649 FM valid tune properties (defaults RSSI 17 dBµV, SNR 10 dB). */ +constexpr std::uint16_t kPropFmValidRssiThreshold = 0x3202U; +constexpr std::uint16_t kPropFmValidSnrThreshold = 0x3204U; +constexpr std::uint16_t kFmValidRssiThresholdDbuV = 0x0005U; +constexpr std::uint16_t kFmValidSnrThresholdDb = 0x0003U; +/** AN649 FM seek band/spacing (10 kHz units): 87.5–107.9 MHz, 100 kHz steps. */ +constexpr std::uint16_t kPropFmSeekBandBottom = 0x3100U; +constexpr std::uint16_t kPropFmSeekBandTop = 0x3101U; +constexpr std::uint16_t kPropFmSeekSpacing = 0x3102U; +constexpr std::uint16_t kFmSeekBandBottomChip = 8750U; +constexpr std::uint16_t kFmSeekBandTopChip = 10790U; +constexpr std::uint16_t kFmSeekSpacingChip = 10U; +/** AN851 §"Varactor Tuning Properties" recommended-network table: FM slope/ + * intercept for 0x1710/0x1711 (Table, "FM" row: 0xEDB5 / 0x01E3). */ +constexpr std::uint16_t kFmTuneFeVarm = 0xEDB5U; +constexpr std::uint16_t kFmTuneFeVarb = 0x01E3U; +constexpr std::uint16_t kFmTuneFeCfgEnable = 0x0001U; constexpr std::uint16_t kPropDabTuneFeCfg = 0x1712U; +constexpr std::uint16_t kPropFmTuneFeCfg = 0x1712U; constexpr std::uint16_t kPropDabXpadEnable = 0xB400U; constexpr std::uint16_t kPropDigitalServiceIntSource = 0x8100U; +/** AN649 INT_CTL_ENABLE / INT_CTL_REPEAT — route STC to INTB until STCACK. */ +constexpr std::uint16_t kPropIntCtlEnable = 0x0000U; +constexpr std::uint16_t kPropIntCtlRepeat = 0x0001U; +constexpr std::uint16_t kIntCtlStcEnable = 0x0001U; ///< STCIEN +constexpr std::uint16_t kIntCtlStcRepeat = 0x0001U; ///< STCREP std::uint16_t readLe16(const std::uint8_t* p) { @@ -140,28 +183,83 @@ std::expected Si4684Driver::waitCts() return std::unexpected(Si4684Error::CtsTimeout); } -std::expected Si4684Driver::waitStc() +std::expected Si4684Driver::pollStc() { std::array pollTx = {}; std::array pollRx = {}; - - for (int attempt = 0; attempt < kStcRetries; ++attempt) { - vTaskDelay(pdMS_TO_TICKS(kStcPollMs)); - spi_transaction_t txn = {}; - txn.length = pollTx.size() * 8U; - txn.tx_buffer = pollTx.data(); - txn.rx_buffer = pollRx.data(); - if (spi_device_transmit(static_cast(spiDevice_), - &txn) != ESP_OK) { - return std::unexpected(Si4684Error::SpiInitFailed); + spi_transaction_t txn = {}; + txn.length = pollTx.size() * 8U; + txn.tx_buffer = pollTx.data(); + txn.rx_buffer = pollRx.data(); + if (spi_device_transmit(static_cast(spiDevice_), + &txn) != ESP_OK) { + return std::unexpected(Si4684Error::SpiInitFailed); + } + // STATUS0 STCINT (AN649 D0) is at pollRx[1] after the SPI lead-in byte. + if ((pollRx[1] & 0x01U) != 0U) { + return true; + } + if (pins_.intbGpio >= 0) { + const gpio_num_t intb = static_cast(pins_.intbGpio); + if (gpio_get_level(intb) == 0) { + return true; } - if ((pollRx[1] & 0x01U) != 0U) { + } + return false; +} + +std::expected Si4684Driver::waitStc(int maxRetries) +{ + for (int attempt = 0; attempt < maxRetries; ++attempt) { + vTaskDelay(pdMS_TO_TICKS(kStcPollMs)); + auto stc = pollStc(); + if (!stc) { + return std::unexpected(stc.error()); + } + if (*stc) { return {}; } } + // Diagnostic: dump the final poll so a STC timeout is distinguishable + // between "chip replies but STCINT never sets" (register/offset bug) + // and "chip stopped replying" (SPI/CTS problem) without guessing. + std::array pollTx = {}; + std::array pollRx = {}; + spi_transaction_t txn = {}; + txn.length = pollTx.size() * 8U; + txn.tx_buffer = pollTx.data(); + txn.rx_buffer = pollRx.data(); + const esp_err_t spiResult = spi_device_transmit( + static_cast(spiDevice_), &txn); + const int intbLevel = pins_.intbGpio >= 0 + ? gpio_get_level(static_cast(pins_.intbGpio)) + : -1; + ESP_LOGW(kTag, + "STC timeout: last poll spi_err=%d status=%02x %02x %02x %02x " + "%02x INTB=%d", + static_cast(spiResult), pollRx[0], pollRx[1], pollRx[2], + pollRx[3], pollRx[4], intbLevel); return std::unexpected(Si4684Error::StcTimeout); } +std::expected Si4684Driver::clearFmStc() +{ + if (auto band = ensureBand(Si4684Band::Fm); !band) { + return band; + } + // AN649 FM_RSQ_STATUS ARG1 STCACK=1 clears a latched STCINT. + const std::uint8_t args[] = {0x01U}; + if (auto cmd = writeCommand(Command::FmRsqStatus, args, sizeof(args)); + !cmd) { + return cmd; + } + std::array raw = {}; + if (auto rd = readRaw(raw); !rd) { + return rd; + } + return {}; +} + std::expected Si4684Driver::sendCommand( std::span bytes) { @@ -314,7 +412,7 @@ std::expected Si4684Driver::getPartInfo() } Si4684PartInfo info = {}; - info.chipId = readLe16(raw.data() + 9); + info.chipId = readLe16(raw.data() + 9U); info.firmwareMajor = fnRaw[5]; info.firmwareMinor = fnRaw[6]; info.firmwareBuild = fnRaw[7]; @@ -341,14 +439,21 @@ std::expected Si4684Driver::getSysState() std::expected Si4684Driver::configureAfterBoot( Si4684Band band) { + if (auto stcEn = setProperty(kPropIntCtlEnable, kIntCtlStcEnable); !stcEn) { + return stcEn; + } + if (auto stcRep = setProperty(kPropIntCtlRepeat, kIntCtlStcRepeat); !stcRep) { + return stcRep; + } + if (band == Si4684Band::Dab) { if (auto plan = installDefaultDabFrequencyPlan(); !plan) { return plan; } + // AN851 recommended-network table, "DAB" row: 0xF8A9 / 0x01C6. static constexpr std::uint16_t kDabProps[][2] = { - {0x0202U, 0x1600U}, - {0x1710U, 0xFC4AU}, - {0x1711U, 0x00F8U}, + {0x1710U, 0xF8A9U}, + {0x1711U, 0x01C6U}, {0x8101U, 0x0064U}, {0xB200U, 0x0000U}, {0xB201U, 0x0080U}, @@ -366,32 +471,92 @@ std::expected Si4684Driver::configureAfterBoot( if (auto xpad = setProperty(kPropDabXpadEnable, 0x0097U); !xpad) { return xpad; } + if (auto dabFe = setProperty(kPropDabTuneFeCfg, 0x0001U); !dabFe) { + ESP_LOGW(kTag, "DAB TUNE_FE_CFG (0x1712) failed"); + return dabFe; + } + if (auto dsrv = setProperty(kPropDigitalServiceIntSource, 0x0001U); + !dsrv) { + ESP_LOGW(kTag, "DIGITAL_SERVICE_INT_SOURCE (0x8100) failed"); + return dsrv; + } } else { + // FM varactor cal per hitech95/uGreen DTS (not DAB PE5PVB values). + static constexpr std::uint16_t kFmFeProps[][2] = { + {0x1710U, kFmTuneFeVarm}, + {0x1711U, kFmTuneFeVarb}, + }; + for (const auto& prop : kFmFeProps) { + if (auto set = setProperty(prop[0], prop[1]); !set) { + return set; + } + } + if (auto feCfg = setProperty(kPropFmTuneFeCfg, kFmTuneFeCfgEnable); + !feCfg) { + return feCfg; + } + static constexpr std::uint16_t kFmSeekProps[][2] = { + {kPropFmSeekBandBottom, kFmSeekBandBottomChip}, + {kPropFmSeekBandTop, kFmSeekBandTopChip}, + {kPropFmSeekSpacing, kFmSeekSpacingChip}, + }; + for (const auto& prop : kFmSeekProps) { + if (auto set = setProperty(prop[0], prop[1]); !set) { + return set; + } + } if (auto rds = setProperty(kPropFmRdsConfig, 0x0001U); !rds) { return rds; } + // AN649 §0x3202/0x3204: lower seek/tune validity for weak lab antennas. + if (auto rssi = setProperty(kPropFmValidRssiThreshold, + kFmValidRssiThresholdDbuV); + !rssi) { + return rssi; + } + if (auto snr = setProperty(kPropFmValidSnrThreshold, + kFmValidSnrThresholdDb); + !snr) { + return snr; + } + ESP_LOGI(kTag, "FM valid tune: RSSI>=%u dBuV SNR>=%u dB", + static_cast(kFmValidRssiThresholdDbuV), + static_cast(kFmValidSnrThresholdDb)); } - if (auto i2s = setProperty(kPropDigitalIoOutputSelect, 0x8000U); !i2s) { - return i2s; + if (auto i2sRole = + setProperty(kPropDigitalIoOutputSelect, kSi4684I2sSlaveSelect); + !i2sRole) { + return i2sRole; } - if (auto rate = setProperty(kPropDigitalIoSampleRate, 0xAC44U); !rate) { + if (auto i2sFmt = + setProperty(kPropDigitalIoOutputFormat, kSi4684I2sOutputFormat); + !i2sFmt) { + return i2sFmt; + } + if (auto rate = + setProperty(kPropDigitalIoSampleRate, kSi4684I2sSampleRateHz); + !rate) { return rate; } if (auto pins = setProperty(kPropPinConfigEnable, 0x0003U); !pins) { return pins; } - if (auto dabFe = setProperty(kPropDabTuneFeCfg, 0x0001U); !dabFe) { - return dabFe; + if (auto mute = setProperty(kPropAudioMute, 0x0000U); !mute) { + return mute; } - if (auto dsrv = setProperty(kPropDigitalServiceIntSource, 0x0001U); - !dsrv) { - return dsrv; + if (auto outCfg = setProperty(kPropAudioOutputConfig, kSi4684I2sOutEnable); + !outCfg) { + return outCfg; + } + if (auto vol = setProperty(kPropAudioVolume, kSi4684VolumeMax); !vol) { + return vol; } return {}; } -std::expected Si4684Driver::boot(Si4684Band band) +std::expected Si4684Driver::boot( + Si4684Band band, std::uint8_t xtalIbias, std::uint8_t xtalCtun) { if (booted_ && loadedBand_ == band) { return {}; @@ -451,12 +616,25 @@ std::expected Si4684Driver::boot(Si4684Band band) spiDevice_ = dev; } + if (pins_.intbGpio >= 0) { + gpio_config_t intCfg = {}; + intCfg.pin_bit_mask = 1ULL << pins_.intbGpio; + intCfg.mode = GPIO_MODE_INPUT; + intCfg.pull_up_en = GPIO_PULLUP_ENABLE; + if (gpio_config(&intCfg) != ESP_OK) { + return std::unexpected(Si4684Error::SpiInitFailed); + } + } + if (auto st = writeCommand(Command::GetSysState, nullptr, 0U); !st) { return st; } - const std::uint8_t powerUp[] = { - 0x17, 0x48, 0x00, 0xf8, 0x24, 0x01, 0x1F, 0x10, + // ARG2=0x17(CLK_MODE=crystal,TR_SIZE), ARG3=IBIAS, ARG4-7=XTAL_FREQ + // 19.2 MHz (0x0124F800), ARG8=CTUN, ARG9=0x10 (fixed bit4=1 per AN649 + // §Command 0x01), ARG10-15=0 (AN649 POWER_UP argument table). + std::uint8_t powerUp[] = { + 0x17, xtalIbias, 0x00, 0xf8, 0x24, 0x01, xtalCtun, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, }; if (auto pu = writeCommand(Command::PowerUp, powerUp, sizeof(powerUp)); @@ -517,6 +695,9 @@ std::expected Si4684Driver::tuneFm( if (auto band = ensureBand(Si4684Band::Fm); !band) { return band; } + if (auto cleared = clearFmStc(); !cleared) { + return cleared; + } const std::uint16_t chipFreq = kHzToChipFmFreq(frequency.value()); const std::uint8_t args[] = { 0x00U, @@ -524,13 +705,38 @@ std::expected Si4684Driver::tuneFm( static_cast(chipFreq >> 8), 0x00U, 0x00U, + 0x00U, // PROG_ID (AN649 ARG6; ignored when DIR_TUNE=0) }; if (auto cmd = writeCommand(Command::FmTuneFreq, args, sizeof(args)); !cmd) { return std::unexpected(Si4684Error::TuneFailed); } - if (auto stc = waitStc(); !stc) { - return stc; + if (auto stc = waitStc(kStcRetries); !stc) { + ESP_LOGW(kTag, "FM tune STC timeout at %u kHz — settling 150 ms", + static_cast(frequency.value())); + vTaskDelay(pdMS_TO_TICKS(150)); + } else { + (void)clearFmStc(); + } + if (auto rsq = readFmRsq(); rsq) { + const std::uint32_t readKhz = + rsq->frequency ? rsq->frequency->value() : 0U; + if (readKhz != 0U && readKhz != frequency.value()) { + ESP_LOGW(kTag, + "FM tune READFREQ mismatch: want %u kHz got %u kHz", + static_cast(frequency.value()), + static_cast(readKhz)); + } + ESP_LOGI(kTag, + "FM tuned %u kHz rssi=%d dBuV snr=%d dB valid=%d readfreq=%u", + static_cast(frequency.value()), + static_cast(rsq->rssiDbuV), + static_cast(rsq->snrDb), + static_cast(rsq->valid), + static_cast(readKhz)); + } else { + ESP_LOGI(kTag, "FM tuned %u kHz (RSQ read failed)", + static_cast(frequency.value())); } return {}; } @@ -541,27 +747,54 @@ std::expected Si4684Driver::seekFm( if (auto band = ensureBand(Si4684Band::Fm); !band) { return std::unexpected(band.error()); } + if (auto cleared = clearFmStc(); !cleared) { + return std::unexpected(cleared.error()); + } + std::optional prevKhz; + if (auto before = readFmRsq(); before && before->frequency) { + prevKhz = before->frequency->value(); + } const bool seekUp = direction == core::SeekDirection::Up; const bool wrapBand = wrap == SeekBandWrap::Wrap; + // AN649 FM_SEEK_START: ARG1=tune/injection, ARG2=SEEKUP|WRAP. + const std::uint8_t seekFlags = + static_cast(((seekUp ? 1U : 0U) << 1U) + | (wrapBand ? 1U : 0U)); const std::uint8_t args[] = { - 0x10U, - static_cast(((seekUp ? 1U : 0U) << 1U) | (wrapBand ? 1U : 0U)), + 0x00U, + seekFlags, 0x00U, 0x00U, 0x00U, }; if (auto cmd = writeCommand(Command::FmSeekStart, args, sizeof(args)); !cmd) { + ESP_LOGW(kTag, "FM seek command failed (flags=0x%02x)", + static_cast(seekFlags)); return std::unexpected(Si4684Error::TuneFailed); } - if (auto stc = waitStc(); !stc) { + if (auto stc = waitStc(kStcRetries); !stc) { + ESP_LOGW(kTag, "FM seek STC timeout (flags=0x%02x)", + static_cast(seekFlags)); return std::unexpected(stc.error()); } + (void)clearFmStc(); auto rsq = readFmRsq(); if (!rsq) { + ESP_LOGW(kTag, "FM seek RSQ read failed"); return std::unexpected(rsq.error()); } - return rsq->frequency; + if (!rsq->frequency) { + ESP_LOGW(kTag, "FM seek READFREQ out of band (valid=%d)", + static_cast(rsq->valid)); + return std::unexpected(Si4684Error::TuneFailed); + } + if (prevKhz && rsq->frequency->value() == *prevKhz) { + ESP_LOGW(kTag, "FM seek READFREQ unchanged at %u kHz", + static_cast(*prevKhz)); + return std::unexpected(Si4684Error::TuneFailed); + } + return *rsq->frequency; } std::expected Si4684Driver::readFmRsq() @@ -579,18 +812,42 @@ std::expected Si4684Driver::readFmRsq() return std::unexpected(rd.error()); } - const auto khz = chipFmFreqToKHz(readLe16(raw.data() + 6)); - if (auto freq = core::FrequencyKHz::tryFromKhz(khz); freq) { - Si4684FmRsq rsq{ - *freq, - static_cast(raw[8]), - static_cast(raw[9]), - (raw[4] & 0x01U) != 0U, - (raw[4] & 0x02U) != 0U, - }; - return rsq; + if (raw.size() < kFmRsqOffSnr + 1U) { + return std::unexpected(Si4684Error::ReplyTooShort); } - return std::unexpected(Si4684Error::CommandFailed); + ESP_LOGI(kTag, + "FM RSQ raw: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x " + "%02x %02x", + raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6], raw[7], + raw[8], raw[9], raw[10], raw[11]); + const auto khz = + chipFmFreqToKHz(readLe16(raw.data() + kFmRsqOffReadFreq)); + const auto freq = core::FrequencyKHz::tryFromKhz(khz); + const bool freqInBand = static_cast(freq); + const bool chipValid = (raw[kFmRsqOffValid] & 0x01U) != 0U; + if (!freqInBand && khz != 0U) { + ESP_LOGW(kTag, + "FM RSQ out-of-band freq %u kHz (st=%02x %02x %02x %02x " + "freq=%02x %02x rssi=%02x snr=%02x)", + static_cast(khz), raw[kSpiReplyLeadIn], + raw[kSpiReplyLeadIn + 1U], + raw[kSpiReplyLeadIn + 2U], raw[kSpiReplyLeadIn + 3U], + raw[kFmRsqOffReadFreq], raw[kFmRsqOffReadFreq + 1U], + raw[kFmRsqOffRssi], raw[kFmRsqOffSnr]); + } else if (khz == 0U && raw[kSpiReplyLeadIn] == 0U + && raw[kSpiReplyLeadIn + 1U] == 0U) { + ESP_LOGW(kTag, "FM RSQ empty reply (st=%02x %02x %02x %02x)", + raw[kSpiReplyLeadIn], raw[kSpiReplyLeadIn + 1U], + raw[kSpiReplyLeadIn + 2U], raw[kSpiReplyLeadIn + 3U]); + } + Si4684FmRsq rsq{ + freqInBand ? std::optional{*freq} : std::nullopt, + static_cast(raw[kFmRsqOffRssi]), + static_cast(raw[kFmRsqOffSnr]), + freqInBand && chipValid, + false, + }; + return rsq; } std::expected Si4684Driver::readFmRds() @@ -611,10 +868,10 @@ std::expected Si4684Driver::readFmRds() Si4684FmRdsStatus rds = {}; rds.received = (raw[4] & 0x01U) != 0U; rds.fifoUsed = raw[10]; - rds.blockA = readLe16(raw.data() + 12); - rds.blockB = readLe16(raw.data() + 14); - rds.blockC = readLe16(raw.data() + 16); - rds.blockD = readLe16(raw.data() + 18); + rds.blockA = readLe16(raw.data() + 12U); + rds.blockB = readLe16(raw.data() + 14U); + rds.blockC = readLe16(raw.data() + 16U); + rds.blockD = readLe16(raw.data() + 18U); return rds; } @@ -708,7 +965,7 @@ std::expected Si4684Driver::tuneDab(std::uint8_t freqIndex) !cmd) { return std::unexpected(Si4684Error::TuneFailed); } - if (auto stc = waitStc(); !stc) { + if (auto stc = waitStc(kStcRetries); !stc) { return stc; } return {}; diff --git a/Software/components/drivers/si4684/src/Si4684Tuner.cpp b/Software/components/drivers/si4684/src/Si4684Tuner.cpp index 7450d14..ed2189e 100644 --- a/Software/components/drivers/si4684/src/Si4684Tuner.cpp +++ b/Software/components/drivers/si4684/src/Si4684Tuner.cpp @@ -13,11 +13,16 @@ #include "si4684/Si4684Tuner.hpp" +#include "esp_log.h" #include "si4684/Si4684Band.hpp" namespace si4684 { namespace { +constexpr char kTag[] = "Si4684Tuner"; +constexpr std::uint32_t kFmSeekStepKhz = 100U; +constexpr std::uint32_t kFmBandBottomKhz = 87500U; +constexpr std::uint32_t kFmBandTopKhz = 107900U; [[nodiscard]] core::FrequencyKHz defaultFmFrequency() { @@ -30,7 +35,8 @@ Si4684Tuner::Si4684Tuner(Si4684Driver& driver) : driver_(driver) , dabIndex_(0U) , fmFrequency_(defaultFmFrequency()) - , volume_(40U) + , volume_(63U) + , fmBandReady_(false) { } @@ -44,6 +50,9 @@ core::TunerError Si4684Tuner::mapError(Si4684Error error) noexcept case Si4684Error::TuneFailed: case Si4684Error::StcTimeout: return core::TunerError::TuneFailed; + case Si4684Error::CtsTimeout: + case Si4684Error::CommandFailed: + return core::TunerError::HardwareFailed; default: return core::TunerError::HardwareFailed; } @@ -68,6 +77,58 @@ std::expected Si4684Tuner::currentBand() cons : core::TunerBand::Dab; } +std::expected Si4684Tuner::ensureBandLoaded( + core::TunerBand band) +{ + const Si4684Band hwTarget = + (band == core::TunerBand::Fm) ? Si4684Band::Fm : Si4684Band::Dab; + if (driver_.isBooted() && driver_.loadedBand() == hwTarget) { + if (hwTarget != Si4684Band::Fm || fmBandReady_) { + return {}; + } + } + + const bool reloading = + !(driver_.isBooted() && driver_.loadedBand() == hwTarget); + if (reloading) { + ESP_LOGI(kTag, "band switch -> %s", + band == core::TunerBand::Fm ? "FM" : "DAB"); + } + + if (driver_.isBooted() && driver_.loadedBand() == Si4684Band::Dab + && hwTarget == Si4684Band::Fm && lastDabServiceId_ + && lastDabComponentId_) { + (void)driver_.stopDabService(*lastDabServiceId_, *lastDabComponentId_); + lastDabServiceId_.reset(); + lastDabComponentId_.reset(); + dabDynamicLabel_.reset(); + } + + if (auto loaded = boot(band); !loaded) { + return loaded; + } + + if (auto vol = driver_.setVolume(volume_); !vol) { + return std::unexpected(mapError(vol.error())); + } + + if (band == core::TunerBand::Fm) { + rdsMetadata_.reset(); + fmFrequency_ = defaultFmFrequency(); + fmBandReady_ = false; + if (auto tuned = driver_.tuneFm(fmFrequency_); !tuned) { + return std::unexpected(mapError(tuned.error())); + } + fmBandReady_ = true; + } else { + fmBandReady_ = false; + dabDynamicLabel_.reset(); + lastDabServiceId_.reset(); + lastDabComponentId_.reset(); + } + return {}; +} + std::expected Si4684Tuner::readStatus() { if (!driver_.isBooted()) { @@ -106,11 +167,20 @@ std::expected Si4684Tuner::readStatus() status.fmFrequency = fmFrequency_; if (auto rsq = driver_.readFmRsq(); rsq) { status.locked = rsq->valid; - status.fmFrequency = rsq->frequency; status.fmRssiDbuV = rsq->rssiDbuV; status.fmSnrDb = rsq->snrDb; status.fmStereo = rsq->stereo; - fmFrequency_ = rsq->frequency; + status.fmChipReadFrequency = rsq->frequency; + // Keep commanded frequency when chip READFREQ is stale (stuck at band + // bottom); adopt READFREQ only when valid or it matches our target. + status.fmFrequency = fmFrequency_; + if (rsq->frequency) { + const std::uint32_t chipKhz = rsq->frequency->value(); + if (rsq->valid || chipKhz == fmFrequency_.value()) { + status.fmFrequency = *rsq->frequency; + fmFrequency_ = *rsq->frequency; + } + } } else { return std::unexpected(mapError(rsq.error())); } @@ -118,7 +188,8 @@ std::expected Si4684Tuner::readStatus() for (int attempt = 0; attempt < 8; ++attempt) { auto rds = driver_.readFmRds(); if (!rds) { - return std::unexpected(mapError(rds.error())); + ESP_LOGW(kTag, "FM RDS read failed (attempt %d)", attempt); + break; } if (!rds->received) { break; @@ -140,6 +211,9 @@ std::expected Si4684Tuner::readStatus() std::expected Si4684Tuner::tuneDab( std::uint8_t freqIndex) { + if (auto ready = ensureBandLoaded(core::TunerBand::Dab); !ready) { + return ready; + } if (auto result = driver_.tuneDab(freqIndex); !result) { return std::unexpected(mapError(result.error())); } @@ -153,14 +227,9 @@ std::expected Si4684Tuner::tuneDab( std::expected Si4684Tuner::tuneFm( core::FrequencyKHz frequency) { - if (driver_.loadedBand() == Si4684Band::Dab && lastDabServiceId_ - && lastDabComponentId_) { - (void)driver_.stopDabService(*lastDabServiceId_, *lastDabComponentId_); - lastDabServiceId_.reset(); - lastDabComponentId_.reset(); - dabDynamicLabel_.reset(); + if (auto ready = ensureBandLoaded(core::TunerBand::Fm); !ready) { + return ready; } - if (auto result = driver_.tuneFm(frequency); !result) { return std::unexpected(mapError(result.error())); } @@ -172,18 +241,55 @@ std::expected Si4684Tuner::tuneFm( std::expected Si4684Tuner::seekFm( core::SeekDirection direction) { - const auto result = driver_.seekFm(direction, SeekBandWrap::Wrap); - if (!result) { - return std::unexpected(mapError(result.error())); + if (auto ready = ensureBandLoaded(core::TunerBand::Fm); !ready) { + return std::unexpected(ready.error()); } - fmFrequency_ = *result; - rdsMetadata_.reset(); - return *result; + const core::FrequencyKHz before = fmFrequency_; + const auto hw = driver_.seekFm(direction, SeekBandWrap::Wrap); + if (hw && hw->value() != before.value()) { + fmFrequency_ = *hw; + rdsMetadata_.reset(); + return *hw; + } + + // hitech95/si468x_dab_receiver uses HW seek + INTB STC; when READFREQ does + // not move, step by FM_SEEK_FREQUENCY_SPACING (100 kHz) via FM_TUNE_FREQ. + std::uint32_t nextKhz = before.value(); + if (direction == core::SeekDirection::Up) { + nextKhz += kFmSeekStepKhz; + if (nextKhz > kFmBandTopKhz) { + nextKhz = kFmBandBottomKhz; + } + } else { + nextKhz = (nextKhz > kFmBandBottomKhz + kFmSeekStepKhz) + ? nextKhz - kFmSeekStepKhz + : kFmBandTopKhz; + } + const auto next = core::FrequencyKHz::tryFromKhz(nextKhz); + if (!next) { + return std::unexpected(core::TunerError::TuneFailed); + } + if (auto stepped = tuneFm(*next); !stepped) { + return std::unexpected(stepped.error()); + } + if (auto rsq = driver_.readFmRsq(); rsq && rsq->frequency) { + ESP_LOGI(kTag, "FM software seek %s -> %u kHz (chip READFREQ)", + direction == core::SeekDirection::Up ? "UP" : "DOWN", + static_cast(rsq->frequency->value())); + return *rsq->frequency; + } + ESP_LOGI(kTag, "FM software seek %s -> %u kHz", + direction == core::SeekDirection::Up ? "UP" : "DOWN", + static_cast(nextKhz)); + return *next; } std::expected, core::TunerError> Si4684Tuner::listDabServices() { + if (auto ready = ensureBandLoaded(core::TunerBand::Dab); !ready) { + return std::unexpected(ready.error()); + } if (auto events = driver_.readDabEventStatus(); events) { if (!events->serviceListReady) { return std::unexpected(core::TunerError::ServiceListEmpty); @@ -215,6 +321,9 @@ std::expected Si4684Tuner::playDabService( std::uint32_t serviceId, std::uint32_t componentId) { + if (auto ready = ensureBandLoaded(core::TunerBand::Dab); !ready) { + return ready; + } if (auto result = driver_.startDabService(serviceId, componentId); !result) { return std::unexpected(mapError(result.error())); } diff --git a/Software/components/net/CMakeLists.txt b/Software/components/net/CMakeLists.txt index 50f7c55..ef5c0f9 100644 --- a/Software/components/net/CMakeLists.txt +++ b/Software/components/net/CMakeLists.txt @@ -4,10 +4,12 @@ idf_component_register( "src/SoftApHost.cpp" "src/StaClient.cpp" "src/SetupWebServer.cpp" + "src/SigmaStudioTcpServer.cpp" + "src/WifiScanner.cpp" "src/NetBootstrap.cpp" INCLUDE_DIRS "include" EMBED_FILES "www/index.html.gz" - REQUIRES core esp_wifi esp_netif esp_event nvs_flash esp_http_server mdns secure_store tuner audio bluetooth station integration ota bt1035 adau1701 + REQUIRES core esp_wifi esp_netif esp_event nvs_flash esp_http_server mdns lwip secure_store tuner audio bluetooth station integration ota bt1035 adau1701 webradio ) target_compile_features(${COMPONENT_LIB} PUBLIC cxx_std_23) diff --git a/Software/components/net/include/net/NetBootstrap.hpp b/Software/components/net/include/net/NetBootstrap.hpp index 9fd24e2..6323243 100644 --- a/Software/components/net/include/net/NetBootstrap.hpp +++ b/Software/components/net/include/net/NetBootstrap.hpp @@ -23,6 +23,7 @@ #include "net/NetError.hpp" #include "net/NetState.hpp" #include "net/SetupWebServer.hpp" +#include "net/SigmaStudioTcpServer.hpp" #include "net/SoftApHost.hpp" #include "net/StaClient.hpp" @@ -53,6 +54,10 @@ namespace tuner { class TunerService; } // namespace tuner +namespace webradio { +class WebRadioService; +} // namespace webradio + namespace net { /** @@ -60,8 +65,9 @@ namespace net { * * @dname NetBootstrap * @return n/a (type) - * @pubstate Owns optional softAp_, optional sta_, and webServer_. Must - * outlive app_main; keep one instance alive for process lifetime. + * @pubstate Owns optional softAp_, optional sta_, webServer_, and + * sigmaStudio_. Must outlive app_main; keep one instance alive + * for process lifetime. * * @author Michele Bigi * @date 2026-07-06 @@ -79,6 +85,7 @@ public: * @param stations Station preset service for REST routes. * @param integration Application orchestration for preset recall. * @param ota Firmware OTA service for POST /api/system/ota. + * @param webRadio Streaming config for GET/POST /api/streaming. * @param companionChips Boot flags exposed on GET /api/health. * @param deviceIdentity EEPROM-derived SSID, hostname, and serial. * @return NetBootstrap on success, or a NetError. @@ -93,6 +100,7 @@ public: station::StationService& stations, integration::IntegrationService& integration, ota::OtaService& ota, + webradio::WebRadioService& webRadio, core::CompanionChipStatus companionChips, const core::DeviceIdentity& deviceIdentity); @@ -106,12 +114,14 @@ public: * @param softAp Optional SoftAP mode host. * @param sta Optional STA client instance. * @param webServer HTTP server instance. + * @param sigmaStudio SigmaStudio TCP:8086 bridge instance. * @param state Initial network state. * @pubstate Transfers ownership of optional network resources. */ NetBootstrap(std::optional softAp, std::optional sta, SetupWebServer webServer, + SigmaStudioTcpServer sigmaStudio, NetState state); /** @@ -119,7 +129,7 @@ public: * * @dname NetBootstrap * @param other Source instance; left empty after the move. - * @pubstate transfers softAp_, sta_, and webServer_ from other. + * @pubstate transfers softAp_, sta_, webServer_, and sigmaStudio_ from other. * * @author Michele Bigi * @date 2026-07-06 @@ -132,7 +142,7 @@ public: * @dname operator= * @param other Source instance; left empty after the move. * @return Reference to this instance. - * @pubstate transfers softAp_, sta_, and webServer_ from other. + * @pubstate transfers softAp_, sta_, webServer_, and sigmaStudio_ from other. * * @author Michele Bigi * @date 2026-07-06 @@ -143,7 +153,7 @@ public: * @brief ~NetBootstrap — tear down network subsystems. * * @dname ~NetBootstrap - * @pubstate destroys softAp_, sta_, and webServer_. + * @pubstate destroys softAp_, sta_, webServer_, and sigmaStudio_. * * @author Michele Bigi * @date 2026-07-06 @@ -166,6 +176,7 @@ private: std::optional softAp_; std::optional sta_; SetupWebServer webServer_; + SigmaStudioTcpServer sigmaStudio_; NetState state_; }; diff --git a/Software/components/net/include/net/NetError.hpp b/Software/components/net/include/net/NetError.hpp index 488cf36..12bd678 100644 --- a/Software/components/net/include/net/NetError.hpp +++ b/Software/components/net/include/net/NetError.hpp @@ -37,10 +37,12 @@ enum class NetError { WifiConfigFailed, WifiStartFailed, HttpServerStartFailed, + TcpServerStartFailed, StaConnectTimeout, StaConnectFailed, StoreSaveFailed, CredentialsNotFound, + WifiScanFailed, }; } // namespace net diff --git a/Software/components/net/include/net/SetupWebServer.hpp b/Software/components/net/include/net/SetupWebServer.hpp index b35c5b8..8770cbe 100644 --- a/Software/components/net/include/net/SetupWebServer.hpp +++ b/Software/components/net/include/net/SetupWebServer.hpp @@ -50,6 +50,10 @@ namespace tuner { class TunerService; } // namespace tuner +namespace webradio { +class WebRadioService; +} // namespace webradio + struct httpd_handle; namespace net { @@ -73,6 +77,7 @@ struct HttpRouteContext { station::StationService* stations; ///< Preset list REST routes. integration::IntegrationService* integration; ///< Preset recall orchestration. ota::OtaService* ota; ///< Firmware OTA streaming. + webradio::WebRadioService* webRadio; ///< Streaming config REST routes. core::CompanionChipStatus companionChips; ///< Boot flags for /api/health. core::DeviceIdentity deviceIdentity; ///< EEPROM-derived unit identity. }; @@ -152,6 +157,7 @@ public: * @param stations Station preset service for list REST routes. * @param integration Application orchestration for preset recall. * @param ota Firmware OTA service for POST /api/system/ota. + * @param webRadio Streaming config for GET/POST /api/streaming. * @param companionChips Boot flags for GET /api/health. * @param deviceIdentity Unit identity for /api/health serialNumber. * @return Ok on success, or NetError::HttpServerStartFailed. @@ -167,6 +173,7 @@ public: station::StationService& stations, integration::IntegrationService& integration, ota::OtaService& ota, + webradio::WebRadioService& webRadio, core::CompanionChipStatus companionChips, const core::DeviceIdentity& deviceIdentity); @@ -179,7 +186,6 @@ private: bluetooth::BluetoothService* bluetooth_; station::StationService* stations_; integration::IntegrationService* integration_; - HttpRouteContext routeContext_; }; } // namespace net diff --git a/Software/components/net/include/net/SigmaStudioTcpServer.hpp b/Software/components/net/include/net/SigmaStudioTcpServer.hpp new file mode 100644 index 0000000..e12fca1 --- /dev/null +++ b/Software/components/net/include/net/SigmaStudioTcpServer.hpp @@ -0,0 +1,133 @@ +/** + * @file SigmaStudioTcpServer.hpp + * @brief TCP bridge exposing the ADAU1701 to SigmaStudio's Remote Connection. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * 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 + * + * Implements the subset of SigmaStudio's TCPi wire protocol needed for + * Connect, Link Compile Download, register read/write, and runtime + * safeload parameter updates, ported from the ADAU1701-TCPi-ESP32 + * reference project (https://github.com/rarranzb/ADAU1701-TCPi-ESP32, + * MIT) onto DigiRadio's existing I2C plumbing + * (components/drivers/adau1701/src/SigmaStudioFW.c). A completed Link + * Compile Download is persisted to the `dsp` flash partition via + * adau1701::FlashDspProgramSource::storeBlob(), so it becomes the + * program DigiRadio boots with next time — same mechanism as + * POST /api/dsp/program. + * + * @author Michele Bigi + * @date 2026-08-07 + */ +#pragma once + +#include "net/NetError.hpp" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#include + +namespace net { + +/** + * @brief SigmaStudioTcpServer — port 8086 bridge to the ADAU1701. + * + * @dname SigmaStudioTcpServer + * @return n/a (type) + * @pubstate Owns a listening socket and a FreeRTOS task for the process + * lifetime once started(); stop()/destructor tear both down. + * Requires adau1701::Adau1701Driver::boot() to have already + * bound the I2C device handle via sigma_studio_set_device(). + * Only one instance may be started at a time: the accept task + * reads the listen fd from a process-lifetime singleton (see + * activeListenFd() in the .cpp) rather than a captured `this`, + * since instances are constructed as locals and move-relocated + * into NetBootstrap — same rationale as SetupWebServer's + * routeContextStorage(). + * + * @author Michele Bigi + * @date 2026-08-07 + */ +class SigmaStudioTcpServer { +public: + /** + * @brief SigmaStudioTcpServer — construct an unstarted server. + * + * @dname SigmaStudioTcpServer + * @pubstate clears listenFd_ and task_. + * + * @author Michele Bigi + * @date 2026-08-07 + */ + SigmaStudioTcpServer(); + + /** + * @brief ~SigmaStudioTcpServer — stop the server if running. + * + * @dname ~SigmaStudioTcpServer + * @pubstate deletes task_ and closes listenFd_ when started. + * + * @author Michele Bigi + * @date 2026-08-07 + */ + ~SigmaStudioTcpServer(); + + SigmaStudioTcpServer(const SigmaStudioTcpServer&) = delete; + SigmaStudioTcpServer& operator=(const SigmaStudioTcpServer&) = delete; + + /** + * @brief SigmaStudioTcpServer — move-construct, transferring ownership. + * + * @dname SigmaStudioTcpServer + * @param other Source server; left stopped after the move. + * @pubstate takes ownership of other.listenFd_ and other.task_. + * + * @author Michele Bigi + * @date 2026-08-07 + */ + SigmaStudioTcpServer(SigmaStudioTcpServer&& other) noexcept; + + /** + * @brief operator= — move-assign, transferring ownership. + * + * @dname operator= + * @param other Source server; left stopped after the move. + * @return Reference to this instance. + * @pubstate takes ownership of other.listenFd_ and other.task_. + * + * @author Michele Bigi + * @date 2026-08-07 + */ + SigmaStudioTcpServer& operator=(SigmaStudioTcpServer&& other) noexcept; + + /** + * @brief start — open the listening socket and spawn the server task. + * + * @dname start + * @return Ok on success, or NetError::TcpServerStartFailed. + * @pubstate writes listenFd_ and task_ on success. + * + * @author Michele Bigi + * @date 2026-08-07 + */ + [[nodiscard]] std::expected start(); + +private: + void stop() noexcept; + + /** @brief FreeRTOS task entry: accepts and serves one client at a time. */ + static void acceptLoopTask(void* arg); + + int listenFd_; + TaskHandle_t task_; +}; + +} // namespace net diff --git a/Software/components/net/include/net/StaClient.hpp b/Software/components/net/include/net/StaClient.hpp index ec699d8..7c5186d 100644 --- a/Software/components/net/include/net/StaClient.hpp +++ b/Software/components/net/include/net/StaClient.hpp @@ -20,6 +20,8 @@ #include "core/WifiCredentials.hpp" #include "net/NetError.hpp" +#include "esp_event.h" + #include #include @@ -107,6 +109,8 @@ public: private: bool connected_; + esp_event_handler_instance_t wifiHandler_; + esp_event_handler_instance_t ipHandler_; }; } // namespace net diff --git a/Software/components/net/include/net/WifiScanner.hpp b/Software/components/net/include/net/WifiScanner.hpp new file mode 100644 index 0000000..5ec5503 --- /dev/null +++ b/Software/components/net/include/net/WifiScanner.hpp @@ -0,0 +1,50 @@ +/** + * @file WifiScanner.hpp + * @brief Blocking Wi-Fi scan wrapper for the setup web UI. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-08-05 + */ +#pragma once + +#include "core/WifiScannedNetwork.hpp" +#include "net/NetError.hpp" + +#include +#include + +namespace net { + +/** + * @brief WifiScanner — runs esp_wifi scan and maps results to core DTOs. + * + * @dname WifiScanner + * @return n/a (type) + * @pubstate Stateless shell helper; assumes esp_wifi_init() already ran. + * + * @author Michele Bigi + * @date 2026-08-05 + */ +class WifiScanner { +public: + /** + * @brief scanNearby — list visible access points sorted by RSSI. + * + * @dname scanNearby + * @return Deduped networks on success, or NetError::WifiScanFailed. + * @pubstate Temporarily switches AP-only mode to APSTA when required. + * + * @author Michele Bigi + * @date 2026-08-05 + */ + [[nodiscard]] static std::expected, + NetError> + scanNearby(); +}; + +} // namespace net diff --git a/Software/components/net/src/NetBootstrap.cpp b/Software/components/net/src/NetBootstrap.cpp index c39b11d..e24f5d7 100644 --- a/Software/components/net/src/NetBootstrap.cpp +++ b/Software/components/net/src/NetBootstrap.cpp @@ -27,6 +27,7 @@ #include "secure_store/NvsPlatformInit.hpp" #include "station/StationService.hpp" #include "tuner/TunerService.hpp" +#include "webradio/WebRadioService.hpp" namespace net { @@ -102,10 +103,12 @@ startSetupMode(core::ISecureStore& store, tuner::TunerService& tuner, station::StationService& stations, integration::IntegrationService& integration, ota::OtaService& ota, + webradio::WebRadioService& webRadio, core::CompanionChipStatus companionChips, const core::DeviceIdentity& deviceIdentity) { esp_netif_create_default_wifi_ap(); + esp_netif_create_default_wifi_sta(); SoftApHost softAp(SoftApConfig::forSsid(deviceIdentity.softApSsid())); if (auto apResult = softAp.start(); !apResult) { @@ -115,17 +118,23 @@ startSetupMode(core::ISecureStore& store, tuner::TunerService& tuner, SetupWebServer webServer; if (auto webResult = webServer.start(store, NetState::SoftApSetup, tuner, audio, - bluetooth, stations, integration, ota, + bluetooth, stations, integration, ota, webRadio, companionChips, deviceIdentity); !webResult) { return std::unexpected(webResult.error()); } + SigmaStudioTcpServer sigmaStudio; + if (auto sigmaResult = sigmaStudio.start(); !sigmaResult) { + ESP_LOGW(kTag, "SigmaStudio TCP bridge failed to start — continuing " + "without it"); + } + ESP_LOGI(kTag, "setup mode ready — SSID %.*s", static_cast(deviceIdentity.softApSsid().size()), deviceIdentity.softApSsid().data()); return NetBootstrap(std::move(softAp), std::nullopt, std::move(webServer), - NetState::SoftApSetup); + std::move(sigmaStudio), NetState::SoftApSetup); } /** @@ -146,6 +155,7 @@ startStaMode(core::ISecureStore& store, tuner::TunerService& tuner, station::StationService& stations, integration::IntegrationService& integration, ota::OtaService& ota, + webradio::WebRadioService& webRadio, core::CompanionChipStatus companionChips, const core::DeviceIdentity& deviceIdentity) { @@ -175,17 +185,23 @@ startStaMode(core::ISecureStore& store, tuner::TunerService& tuner, SetupWebServer webServer; if (auto webResult = webServer.start(store, NetState::StaConnected, tuner, audio, - bluetooth, stations, integration, ota, + bluetooth, stations, integration, ota, webRadio, companionChips, deviceIdentity); !webResult) { return std::unexpected(webResult.error()); } + SigmaStudioTcpServer sigmaStudio; + if (auto sigmaResult = sigmaStudio.start(); !sigmaResult) { + ESP_LOGW(kTag, "SigmaStudio TCP bridge failed to start — continuing " + "without it"); + } + ESP_LOGI(kTag, "STA mode ready — hostname %.*s.local", static_cast(deviceIdentity.hostname().size()), deviceIdentity.hostname().data()); return NetBootstrap(std::nullopt, std::move(sta), std::move(webServer), - NetState::StaConnected); + std::move(sigmaStudio), NetState::StaConnected); } } // namespace @@ -197,6 +213,7 @@ NetBootstrap::start(core::ISecureStore& store, tuner::TunerService& tuner, station::StationService& stations, integration::IntegrationService& integration, ota::OtaService& ota, + webradio::WebRadioService& webRadio, core::CompanionChipStatus companionChips, const core::DeviceIdentity& deviceIdentity) { @@ -210,8 +227,8 @@ NetBootstrap::start(core::ISecureStore& store, tuner::TunerService& tuner, if (store.hasWifiCredentials()) { auto staResult = startStaMode(store, tuner, audio, bluetooth, stations, - integration, ota, companionChips, - deviceIdentity); + integration, ota, webRadio, + companionChips, deviceIdentity); if (staResult) { return staResult; } @@ -223,16 +240,18 @@ NetBootstrap::start(core::ISecureStore& store, tuner::TunerService& tuner, } return startSetupMode(store, tuner, audio, bluetooth, stations, integration, - ota, companionChips, deviceIdentity); + ota, webRadio, companionChips, deviceIdentity); } NetBootstrap::NetBootstrap(std::optional softAp, std::optional sta, SetupWebServer webServer, + SigmaStudioTcpServer sigmaStudio, NetState state) : softAp_(std::move(softAp)) , sta_(std::move(sta)) , webServer_(std::move(webServer)) + , sigmaStudio_(std::move(sigmaStudio)) , state_(state) { } diff --git a/Software/components/net/src/SetupWebServer.cpp b/Software/components/net/src/SetupWebServer.cpp index 9f1da4d..2ca8167 100644 --- a/Software/components/net/src/SetupWebServer.cpp +++ b/Software/components/net/src/SetupWebServer.cpp @@ -21,11 +21,9 @@ #include "core/AudioProfile.hpp" #include "core/AudioProfileJson.hpp" #include "core/BluetoothJson.hpp" +#include "core/Bt1035ScannedDevice.hpp" #include "core/CompanionChipStatus.hpp" #include "core/DspProgramBlob.hpp" -#include "core/FirmwareVersion.hpp" -#include "core/HealthStatus.hpp" -#include "core/HealthStatusJson.hpp" #include "core/IntegrationError.hpp" #include "core/ParseError.hpp" #include "core/SeekDirection.hpp" @@ -33,6 +31,8 @@ #include "core/StoreError.hpp" #include "core/TunerJson.hpp" #include "core/WifiProvisionJson.hpp" +#include "core/WifiScanJson.hpp" +#include "net/WifiScanner.hpp" #include "tuner/TunerService.hpp" #include "audio/AudioService.hpp" #include "bluetooth/BluetoothService.hpp" @@ -42,10 +42,13 @@ #include "ota/OtaService.hpp" #include "ota/OtaError.hpp" #include "core/OtaAppDescriptor.hpp" +#include "core/WebRadioJson.hpp" #include "bt1035/Bt1035Error.hpp" +#include "webradio/WebRadioService.hpp" #include "esp_http_server.h" #include "esp_log.h" +#include "esp_netif.h" #include "esp_system.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -53,6 +56,8 @@ #include #include #include +#include +#include #include #include @@ -68,6 +73,49 @@ extern const uint8_t index_html_gz_start[] asm( extern const uint8_t index_html_gz_end[] asm( "_binary_index_html_gz_end"); +/** + * @brief routeContextStorage — app-lifetime HTTP handler dependencies. + * + * @dname routeContextStorage + * @return Reference to the singleton route context. + * @pubstate Populated in SetupWebServer::start(); stable across moves so + * esp_http_server user_ctx never goes stale. + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] HttpRouteContext& routeContextStorage() noexcept +{ + static HttpRouteContext ctx{ + .store = nullptr, + .tuner = nullptr, + .audio = nullptr, + .bluetooth = nullptr, + .stations = nullptr, + .integration = nullptr, + .ota = nullptr, + .webRadio = nullptr, + .companionChips = {}, + .deviceIdentity = core::DeviceIdentity::unknown(), + }; + return ctx; +} + +/** + * @brief routeContextReady — whether start() populated route dependencies. + * + * @dname routeContextReady + * @return true after SetupWebServer::start() succeeds. + * @pubstate reads routeContextStorage().store. + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] bool routeContextReady() noexcept +{ + return routeContextStorage().store != nullptr; +} + /** * @brief routeContextFrom — read handler dependencies from user_ctx. * @@ -81,7 +129,10 @@ extern const uint8_t index_html_gz_end[] asm( */ [[nodiscard]] HttpRouteContext* routeContextFrom(httpd_req_t* req) noexcept { - return static_cast(req->user_ctx); + if (req != nullptr && req->user_ctx != nullptr) { + return static_cast(req->user_ctx); + } + return routeContextReady() ? &routeContextStorage() : nullptr; } /** @@ -216,21 +267,64 @@ template esp_err_t healthGetHandler(httpd_req_t* req) { auto* ctx = routeContextFrom(req); - const core::CompanionChipStatus chips = - ctx != nullptr - ? ctx->companionChips - : core::CompanionChipStatus{ - .si4684Ready = false, - .adau1701Ready = false, - .bt1035Ready = false, - }; - const core::HealthStatus status = core::HealthStatus::ok( - core::FirmwareVersion(kFirmwareVersion), chips, - ctx != nullptr ? ctx->deviceIdentity.serialNumber() - : std::string_view("unknown")); - const std::string json = core::serializeHealthStatusJson(status); + + bool si4684Ready = false; + bool adau1701Ready = false; + bool bt1035Ready = false; + const char* serialNumber = "unknown"; + if (ctx != nullptr) { + si4684Ready = ctx->companionChips.si4684Ready; + adau1701Ready = ctx->companionChips.adau1701Ready; + bt1035Ready = ctx->companionChips.bt1035Ready; + const std::string_view serial = ctx->deviceIdentity.serialNumber(); + if (!serial.empty() && serial.size() <= 32U) { + serialNumber = serial.data(); + } + } + + char ipAddr[16] = {}; + esp_netif_t* staNetif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); + if (staNetif != nullptr) { + esp_netif_ip_info_t ipInfo{}; + if (esp_netif_get_ip_info(staNetif, &ipInfo) == ESP_OK + && ipInfo.ip.addr != 0U) { + std::snprintf(ipAddr, sizeof(ipAddr), IPSTR, IP2STR(&ipInfo.ip)); + } + } + if (ipAddr[0] == '\0') { + esp_netif_t* apNetif = esp_netif_get_handle_from_ifkey("WIFI_AP_DEF"); + if (apNetif != nullptr) { + esp_netif_ip_info_t ipInfo{}; + if (esp_netif_get_ip_info(apNetif, &ipInfo) == ESP_OK + && ipInfo.ip.addr != 0U) { + std::snprintf(ipAddr, sizeof(ipAddr), IPSTR, IP2STR(&ipInfo.ip)); + } + } + } + + char json[320]; + int jsonLen = 0; + if (ipAddr[0] != '\0') { + jsonLen = std::snprintf( + json, sizeof(json), + R"({"status":"ok","fw":"%s","serialNumber":"%s","ip":"%s","chips":{"si4684":%s,"adau1701":%s,"bt1035":%s}})", + kFirmwareVersion, serialNumber, ipAddr, + si4684Ready ? "true" : "false", adau1701Ready ? "true" : "false", + bt1035Ready ? "true" : "false"); + } else { + jsonLen = std::snprintf( + json, sizeof(json), + R"({"status":"ok","fw":"%s","serialNumber":"%s","chips":{"si4684":%s,"adau1701":%s,"bt1035":%s}})", + kFirmwareVersion, serialNumber, si4684Ready ? "true" : "false", + adau1701Ready ? "true" : "false", bt1035Ready ? "true" : "false"); + } + if (jsonLen <= 0 || jsonLen >= static_cast(sizeof(json))) { + httpd_resp_set_status(req, "500 Internal Server Error"); + return httpd_resp_send(req, nullptr, 0); + } + httpd_resp_set_type(req, "application/json"); - return httpd_resp_send(req, json.c_str(), json.size()); + return httpd_resp_send(req, json, static_cast(jsonLen)); } /** @@ -446,6 +540,61 @@ esp_err_t tunerSeekPostHandler(httpd_req_t* req) return httpd_resp_send(req, json.c_str(), json.size()); } +/** + * @brief tunerScanPostHandler — automatic FM/DAB station search (test mode). + * + * @dname tunerScanPostHandler + * @param req HTTP request handle from esp_http_server. + * @return ESP_OK on success, or an esp_err_t error code. + * @pubstate uses route context tuner service; may block tens of seconds. + * + * @author Michele Bigi + * @date 2026-08-05 + */ +esp_err_t tunerScanPostHandler(httpd_req_t* req) +{ + auto* ctx = routeContextFrom(req); + if (ctx == nullptr || ctx->tuner == nullptr) { + httpd_resp_set_status(req, "503 Service Unavailable"); + return httpd_resp_send(req, nullptr, 0); + } + + std::array body{}; + if (!readRequestBody(req, body)) { + httpd_resp_set_status(req, "400 Bad Request"); + return httpd_resp_send(req, nullptr, 0); + } + + const auto parsed = + core::parseTunerScanJson(std::string_view(body.data())); + if (!parsed) { + const std::string json = + core::serializeTunerErrorJson(parseErrorToken(parsed.error())); + httpd_resp_set_status(req, "400 Bad Request"); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + ESP_LOGI(kTag, "tuner scan HTTP band=%s max_steps=%u name='%.*s'", + parsed->band == core::TunerBand::Fm ? "fm" : "dab", + static_cast(parsed->maxSteps), + static_cast(parsed->nameFilter.size()), + parsed->nameFilter.c_str()); + + auto result = ctx->tuner->scanForStation(*parsed); + if (!result) { + const std::string json = + core::serializeTunerErrorJson(tunerErrorToken(result.error())); + httpd_resp_set_status(req, "409 Conflict"); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + const std::string json = core::serializeTunerScanJson(*result); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); +} + /** * @brief audioProfileGetHandler — serve GET /api/audio/profile JSON. * @@ -608,6 +757,125 @@ esp_err_t audioBassEnhancePostHandler(httpd_req_t* req) return audioEnhancePostHandler(req, false); } +/** + * @brief audioBeepPostHandler — toggle the ADAU1701 Beep1 tone generator. + * + * @dname audioBeepPostHandler + * @param req HTTP request handle from esp_http_server. + * @return ESP_OK on success, or an esp_err_t error code. + * @pubstate live-only safeload; does not touch AudioProfile or NVS. + * + * @author Michele Bigi + * @date 2026-08-07 + */ +esp_err_t audioBeepPostHandler(httpd_req_t* req) +{ + auto* ctx = routeContextFrom(req); + if (ctx == nullptr || ctx->audio == nullptr) { + httpd_resp_set_status(req, "503 Service Unavailable"); + return httpd_resp_send(req, nullptr, 0); + } + + std::array body{}; + if (!readRequestBody(req, body)) { + httpd_resp_set_status(req, "400 Bad Request"); + return httpd_resp_send(req, nullptr, 0); + } + + const auto parsed = core::parseBeepEnabledJson(std::string_view(body.data())); + if (!parsed) { + const std::string json = + core::serializeAudioErrorJson(parseErrorToken(parsed.error())); + httpd_resp_set_status(req, "400 Bad Request"); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + if (auto applied = ctx->audio->setBeepEnabled(*parsed); !applied) { + const std::string json = core::serializeAudioErrorJson("dsp_failed"); + httpd_resp_set_status(req, "500 Internal Server Error"); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + const std::string json = core::serializeAudioSavedJson(); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); +} + +/** + * @brief streamingGetHandler — serve GET /api/streaming as JSON. + * + * @dname streamingGetHandler + * @param req HTTP request handle from esp_http_server. + * @return ESP_OK on success, or an esp_err_t error code. + * @pubstate reads route context web radio service snapshot. + * + * @author Michele Bigi + * @date 2026-08-08 + */ +esp_err_t streamingGetHandler(httpd_req_t* req) +{ + auto* ctx = routeContextFrom(req); + if (ctx == nullptr || ctx->webRadio == nullptr) { + httpd_resp_set_status(req, "503 Service Unavailable"); + return httpd_resp_send(req, nullptr, 0); + } + const std::string json = + core::serializeWebRadioConfigJson(ctx->webRadio->config()); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); +} + +/** + * @brief streamingPostHandler — accept POST /api/streaming JSON. + * + * @dname streamingPostHandler + * @param req HTTP request handle from esp_http_server. + * @return ESP_OK on success, or an esp_err_t error code. + * @pubstate persists config to NVS and updates the live streaming task + * config; takes effect without a reboot. + * + * @author Michele Bigi + * @date 2026-08-08 + */ +esp_err_t streamingPostHandler(httpd_req_t* req) +{ + auto* ctx = routeContextFrom(req); + if (ctx == nullptr || ctx->webRadio == nullptr) { + httpd_resp_set_status(req, "503 Service Unavailable"); + return httpd_resp_send(req, nullptr, 0); + } + + std::array body{}; + if (!readRequestBody(req, body)) { + httpd_resp_set_status(req, "400 Bad Request"); + return httpd_resp_send(req, nullptr, 0); + } + + const auto parsed = + core::parseWebRadioConfigJson(std::string_view(body.data())); + if (!parsed) { + const std::string json = + core::serializeWebRadioErrorJson(parseErrorToken(parsed.error())); + httpd_resp_set_status(req, "400 Bad Request"); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + if (auto applied = ctx->webRadio->setConfig(*parsed); !applied) { + const std::string json = + core::serializeWebRadioErrorJson("store_failed"); + httpd_resp_set_status(req, "500 Internal Server Error"); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + const std::string json = core::serializeWebRadioConfigJson(*parsed); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); +} + /** * @brief indexGetHandler — serve gzipped setup page from flash. * @param req HTTP request handle from esp_http_server. @@ -699,6 +967,35 @@ esp_err_t wifiPostHandler(httpd_req_t* req) return ESP_OK; } +/** + * @brief wifiScanPostHandler — list nearby Wi-Fi access points. + * + * @dname wifiScanPostHandler + * @param req HTTP request handle from esp_http_server. + * @return ESP_OK on success, or an esp_err_t error code. + * @pubstate runs esp_wifi scan via WifiScanner. + * + * @author Michele Bigi + * @date 2026-08-05 + */ +esp_err_t wifiScanPostHandler(httpd_req_t* req) +{ + (void)req; + + auto networks = WifiScanner::scanNearby(); + if (!networks) { + const std::string json = + core::serializeWifiScanErrorJson("scan_failed"); + httpd_resp_set_status(req, "500 Internal Server Error"); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + const std::string json = core::serializeWifiScanJson(*networks); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); +} + /** * @brief dspProgramPostHandler — store validated ADAU program blob to flash. * @@ -939,6 +1236,191 @@ esp_err_t bluetoothPairedGetHandler(httpd_req_t* req) return httpd_resp_send(req, json.c_str(), json.size()); } +esp_err_t bluetoothScanPostHandler(httpd_req_t* req) +{ + auto* ctx = routeContextFrom(req); + if (ctx == nullptr || ctx->bluetooth == nullptr) { + httpd_resp_set_status(req, "503 Service Unavailable"); + return httpd_resp_send(req, nullptr, 0); + } + + ESP_LOGI(kTag, "bluetooth scan HTTP request"); + + std::uint8_t scanSeconds = 45U; + std::array body{}; + if (readRequestBody(req, body)) { + const std::string_view payload(body.data()); + const std::string needle = "\"seconds\":"; + const std::size_t start = payload.find(needle); + if (start != std::string_view::npos) { + char* end = nullptr; + const unsigned long raw = std::strtoul( + payload.data() + start + needle.size(), &end, 10); + if (end != payload.data() + start + needle.size() && raw >= 1U + && raw <= 255U) { + scanSeconds = static_cast(raw); + } + } + } + ESP_LOGI(kTag, "bluetooth scan HTTP seconds=%u", + static_cast(scanSeconds)); + + auto devices = ctx->bluetooth->scanNearby(scanSeconds); + if (!devices) { + ESP_LOGW(kTag, "bluetooth scan failed: %s", + bt1035ErrorToken(devices.error())); + const std::string json = + core::serializeBluetoothErrorJson(bt1035ErrorToken(devices.error())); + httpd_resp_set_status(req, "500 Internal Server Error"); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + ESP_LOGI(kTag, "bluetooth scan HTTP OK: %u device(s)", + static_cast(devices->size())); + for (const core::Bt1035ScannedDevice& device : *devices) { + ESP_LOGI(kTag, "bluetooth scan HTTP result: mac=%s name=%s rssi=%d", + device.mac.c_str(), + device.name.empty() ? "(no name)" : device.name.c_str(), + static_cast(device.rssiDbm)); + } + const std::string json = core::serializeBluetoothScanJson(*devices); + ESP_LOGI(kTag, "bluetooth scan JSON length=%u", + static_cast(json.size())); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); +} + +esp_err_t bluetoothConnectPostHandler(httpd_req_t* req) +{ + auto* ctx = routeContextFrom(req); + if (ctx == nullptr || ctx->bluetooth == nullptr) { + httpd_resp_set_status(req, "503 Service Unavailable"); + return httpd_resp_send(req, nullptr, 0); + } + + std::array body{}; + if (!readRequestBody(req, body)) { + httpd_resp_set_status(req, "400 Bad Request"); + return httpd_resp_send(req, nullptr, 0); + } + + const core::BluetoothConnectRequest request = + core::parseBluetoothConnectRequest(std::string_view(body.data())); + if (request.mac.empty()) { + const std::string json = + core::serializeBluetoothErrorJson("invalid_mac"); + httpd_resp_set_status(req, "400 Bad Request"); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + ESP_LOGI(kTag, "bluetooth connect HTTP mac=%s save=%s", + request.mac.c_str(), request.save ? "yes" : "no"); + + if (auto result = ctx->bluetooth->connectTo(request); !result) { + const std::string json = + core::serializeBluetoothErrorJson(bt1035ErrorToken(result.error())); + httpd_resp_set_status(req, "500 Internal Server Error"); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, "{\"status\":\"connected\"}", 24); +} + +esp_err_t bluetoothSpeakerGetHandler(httpd_req_t* req) +{ + auto* ctx = routeContextFrom(req); + if (ctx == nullptr || ctx->bluetooth == nullptr) { + httpd_resp_set_status(req, "503 Service Unavailable"); + return httpd_resp_send(req, nullptr, 0); + } + + if (!ctx->bluetooth->hasSavedSpeaker()) { + const std::string json = core::serializeBluetoothSpeakerJson(nullptr); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + const auto target = ctx->bluetooth->loadSavedSpeaker(); + if (!target) { + httpd_resp_set_status(req, "500 Internal Server Error"); + return httpd_resp_send(req, nullptr, 0); + } + + const std::string json = core::serializeBluetoothSpeakerJson(&(*target)); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); +} + +esp_err_t bluetoothSpeakerPostHandler(httpd_req_t* req) +{ + auto* ctx = routeContextFrom(req); + if (ctx == nullptr || ctx->bluetooth == nullptr) { + httpd_resp_set_status(req, "503 Service Unavailable"); + return httpd_resp_send(req, nullptr, 0); + } + + std::array body{}; + if (!readRequestBody(req, body)) { + httpd_resp_set_status(req, "400 Bad Request"); + return httpd_resp_send(req, nullptr, 0); + } + + const auto target = core::parseBluetoothSpeakerJson(std::string_view(body.data())); + if (!target) { + const std::string json = + core::serializeBluetoothErrorJson(parseErrorToken(target.error())); + httpd_resp_set_status(req, "400 Bad Request"); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + if (auto saved = ctx->bluetooth->saveSpeaker(*target); !saved) { + httpd_resp_set_status(req, "500 Internal Server Error"); + return httpd_resp_send(req, nullptr, 0); + } + + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, "{\"status\":\"saved\"}", 18); +} + +esp_err_t bluetoothSpeakerDeleteHandler(httpd_req_t* req) +{ + auto* ctx = routeContextFrom(req); + if (ctx == nullptr || ctx->bluetooth == nullptr) { + httpd_resp_set_status(req, "503 Service Unavailable"); + return httpd_resp_send(req, nullptr, 0); + } + + (void)ctx->bluetooth->clearSavedSpeaker(); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, "{\"status\":\"cleared\"}", 20); +} + +esp_err_t bluetoothReconnectPostHandler(httpd_req_t* req) +{ + auto* ctx = routeContextFrom(req); + if (ctx == nullptr || ctx->bluetooth == nullptr) { + httpd_resp_set_status(req, "503 Service Unavailable"); + return httpd_resp_send(req, nullptr, 0); + } + + ESP_LOGI(kTag, "bluetooth reconnect HTTP request"); + if (auto result = ctx->bluetooth->reconnectSavedSpeaker(true); !result) { + const std::string json = + core::serializeBluetoothErrorJson(bt1035ErrorToken(result.error())); + httpd_resp_set_status(req, "500 Internal Server Error"); + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, json.c_str(), json.size()); + } + + httpd_resp_set_type(req, "application/json"); + return httpd_resp_send(req, "{\"status\":\"connected\"}", 24); +} + esp_err_t bluetoothAutoReconnectPostHandler(httpd_req_t* req) { auto* ctx = routeContextFrom(req); @@ -1124,9 +1606,6 @@ SetupWebServer::SetupWebServer() , bluetooth_(nullptr) , stations_(nullptr) , integration_(nullptr) - , routeContext_{nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, core::CompanionChipStatus{false, false, false}, - core::DeviceIdentity::unknown()} { } @@ -1139,7 +1618,6 @@ SetupWebServer::SetupWebServer(SetupWebServer&& other) noexcept , bluetooth_(other.bluetooth_) , stations_(other.stations_) , integration_(other.integration_) - , routeContext_(other.routeContext_) { other.server_ = nullptr; other.store_ = nullptr; @@ -1149,8 +1627,6 @@ SetupWebServer::SetupWebServer(SetupWebServer&& other) noexcept other.bluetooth_ = nullptr; other.stations_ = nullptr; other.integration_ = nullptr; - other.routeContext_ = {nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, {}, core::DeviceIdentity::unknown()}; } SetupWebServer& SetupWebServer::operator=(SetupWebServer&& other) noexcept @@ -1167,7 +1643,6 @@ SetupWebServer& SetupWebServer::operator=(SetupWebServer&& other) noexcept bluetooth_ = other.bluetooth_; stations_ = other.stations_; integration_ = other.integration_; - routeContext_ = other.routeContext_; other.server_ = nullptr; other.store_ = nullptr; other.netState_ = NetState::Uninitialized; @@ -1176,9 +1651,6 @@ SetupWebServer& SetupWebServer::operator=(SetupWebServer&& other) noexcept other.bluetooth_ = nullptr; other.stations_ = nullptr; other.integration_ = nullptr; - other.routeContext_ = {nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, core::CompanionChipStatus{false, false, false}, - core::DeviceIdentity::unknown()}; } return *this; } @@ -1189,9 +1661,6 @@ SetupWebServer::~SetupWebServer() httpd_stop(server_); server_ = nullptr; } - routeContext_ = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, core::CompanionChipStatus{false, false, false}, - core::DeviceIdentity::unknown()}; } std::expected SetupWebServer::start( @@ -1203,6 +1672,7 @@ std::expected SetupWebServer::start( station::StationService& stations, integration::IntegrationService& integration, ota::OtaService& ota, + webradio::WebRadioService& webRadio, core::CompanionChipStatus companionChips, const core::DeviceIdentity& deviceIdentity) { @@ -1217,30 +1687,34 @@ std::expected SetupWebServer::start( bluetooth_ = &bluetooth; stations_ = &stations; integration_ = &integration; - routeContext_.store = &store; - routeContext_.tuner = &tuner; - routeContext_.audio = &audio; - routeContext_.bluetooth = &bluetooth; - routeContext_.stations = &stations; - routeContext_.integration = &integration; - routeContext_.ota = &ota; - routeContext_.companionChips = companionChips; - routeContext_.deviceIdentity = deviceIdentity; + auto& routeContext = routeContextStorage(); + routeContext.store = &store; + routeContext.tuner = &tuner; + routeContext.audio = &audio; + routeContext.bluetooth = &bluetooth; + routeContext.stations = &stations; + routeContext.integration = &integration; + routeContext.ota = &ota; + routeContext.webRadio = &webRadio; + routeContext.companionChips = companionChips; + routeContext.deviceIdentity = deviceIdentity; httpd_config_t config = HTTPD_DEFAULT_CONFIG(); + config.stack_size = 12288; + config.max_open_sockets = 3; config.max_uri_handlers = 40; config.server_port = 80; config.lru_purge_enable = true; + config.recv_wait_timeout = 60; + config.send_wait_timeout = 60; if (httpd_start(&server_, &config) != ESP_OK) { ESP_LOGE(kTag, "httpd_start failed"); - routeContext_ = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, core::CompanionChipStatus{false, false, false}, - core::DeviceIdentity::unknown()}; + routeContext.store = nullptr; return std::unexpected(NetError::HttpServerStartFailed); } - void* routeCtx = &routeContext_; + void* routeCtx = &routeContext; const httpd_uri_t healthUri = { .uri = "/api/health", @@ -1266,6 +1740,14 @@ std::expected SetupWebServer::start( }; httpd_register_uri_handler(server_, &wifiUri); + const httpd_uri_t wifiScanUri = { + .uri = "/api/wifi/scan", + .method = HTTP_POST, + .handler = wifiScanPostHandler, + .user_ctx = routeCtx, + }; + httpd_register_uri_handler(server_, &wifiScanUri); + const httpd_uri_t tunerStatusUri = { .uri = "/api/tuner/status", .method = HTTP_GET, @@ -1306,6 +1788,14 @@ std::expected SetupWebServer::start( }; httpd_register_uri_handler(server_, &tunerSeekUri); + const httpd_uri_t tunerScanUri = { + .uri = "/api/tuner/scan", + .method = HTTP_POST, + .handler = tunerScanPostHandler, + .user_ctx = routeCtx, + }; + httpd_register_uri_handler(server_, &tunerScanUri); + const httpd_uri_t audioProfileGetUri = { .uri = "/api/audio/profile", .method = HTTP_GET, @@ -1346,6 +1836,30 @@ std::expected SetupWebServer::start( }; httpd_register_uri_handler(server_, &audioBassEnhanceUri); + const httpd_uri_t audioBeepUri = { + .uri = "/api/audio/beep", + .method = HTTP_POST, + .handler = audioBeepPostHandler, + .user_ctx = routeCtx, + }; + httpd_register_uri_handler(server_, &audioBeepUri); + + const httpd_uri_t streamingGetUri = { + .uri = "/api/streaming", + .method = HTTP_GET, + .handler = streamingGetHandler, + .user_ctx = routeCtx, + }; + httpd_register_uri_handler(server_, &streamingGetUri); + + const httpd_uri_t streamingPostUri = { + .uri = "/api/streaming", + .method = HTTP_POST, + .handler = streamingPostHandler, + .user_ctx = routeCtx, + }; + httpd_register_uri_handler(server_, &streamingPostUri); + const httpd_uri_t dspProgramUri = { .uri = "/api/dsp/program", .method = HTTP_POST, @@ -1402,6 +1916,54 @@ std::expected SetupWebServer::start( }; httpd_register_uri_handler(server_, &bluetoothPairedUri); + const httpd_uri_t bluetoothScanUri = { + .uri = "/api/bluetooth/scan", + .method = HTTP_POST, + .handler = bluetoothScanPostHandler, + .user_ctx = routeCtx, + }; + httpd_register_uri_handler(server_, &bluetoothScanUri); + + const httpd_uri_t bluetoothConnectUri = { + .uri = "/api/bluetooth/connect", + .method = HTTP_POST, + .handler = bluetoothConnectPostHandler, + .user_ctx = routeCtx, + }; + httpd_register_uri_handler(server_, &bluetoothConnectUri); + + const httpd_uri_t bluetoothSpeakerGetUri = { + .uri = "/api/bluetooth/speaker", + .method = HTTP_GET, + .handler = bluetoothSpeakerGetHandler, + .user_ctx = routeCtx, + }; + httpd_register_uri_handler(server_, &bluetoothSpeakerGetUri); + + const httpd_uri_t bluetoothSpeakerPostUri = { + .uri = "/api/bluetooth/speaker", + .method = HTTP_POST, + .handler = bluetoothSpeakerPostHandler, + .user_ctx = routeCtx, + }; + httpd_register_uri_handler(server_, &bluetoothSpeakerPostUri); + + const httpd_uri_t bluetoothSpeakerDeleteUri = { + .uri = "/api/bluetooth/speaker", + .method = HTTP_DELETE, + .handler = bluetoothSpeakerDeleteHandler, + .user_ctx = routeCtx, + }; + httpd_register_uri_handler(server_, &bluetoothSpeakerDeleteUri); + + const httpd_uri_t bluetoothReconnectUri = { + .uri = "/api/bluetooth/reconnect", + .method = HTTP_POST, + .handler = bluetoothReconnectPostHandler, + .user_ctx = routeCtx, + }; + httpd_register_uri_handler(server_, &bluetoothReconnectUri); + const httpd_uri_t bluetoothAutoReconnectUri = { .uri = "/api/bluetooth/auto-reconnect", .method = HTTP_POST, diff --git a/Software/components/net/src/SigmaStudioTcpServer.cpp b/Software/components/net/src/SigmaStudioTcpServer.cpp new file mode 100644 index 0000000..c0aae3d --- /dev/null +++ b/Software/components/net/src/SigmaStudioTcpServer.cpp @@ -0,0 +1,570 @@ +/** + * @file SigmaStudioTcpServer.cpp + * @brief SigmaStudioTcpServer implementation. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * 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 + * + * @author Michele Bigi + * @date 2026-08-07 + */ + +#include "net/SigmaStudioTcpServer.hpp" + +#include "adau1701/FlashDspProgramSource.hpp" + +#include "core/DspProgram.hpp" +#include "core/DspProgramBlob.hpp" +#include "core/RegisterWrite.hpp" + +#include "SigmaStudioFW.h" + +#include "esp_log.h" + +#include "lwip/sockets.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace net { + +namespace { + +constexpr char kTag[] = "SigmaTcp"; +constexpr std::uint16_t kPort = 8086U; +constexpr std::size_t kRecvBufSize = 16U * 1024U; +constexpr std::uint32_t kTaskStackBytes = 8192U; +constexpr UBaseType_t kTaskPriority = 5U; + +constexpr std::uint8_t kCtrlWrite = 0x09U; +constexpr std::uint8_t kCtrlReadReq = 0x0AU; +constexpr std::uint8_t kCtrlReadResp = 0x0BU; +constexpr std::uint8_t kChipAddrDsp = 0x01U; +// board::pins::Adau1701Addr (main/board_pins.hpp), duplicated as a literal +// to avoid a net -> main include dependency; keep in sync if the board's +// I2C address ever changes. The reference project accepts both the IC +// index (0x01) and the raw address as chipAddr since it's unclear which +// convention real SigmaStudio uses for a single-IC project — mirrored here. +constexpr std::uint8_t kDspI2cAddr7 = 0x34U; + +[[nodiscard]] bool isDspChipAddr(std::uint8_t chipAddr) noexcept +{ + return chipAddr == kChipAddrDsp || chipAddr == kDspI2cAddr7; +} + +/** + * @brief activeListenFd — process-lifetime storage for the listen fd. + * + * @dname activeListenFd + * @return Reference to the singleton listen-fd slot. + * @pubstate Written by SigmaStudioTcpServer::start()/stop(); read by + * acceptLoopTask(). SigmaStudioTcpServer is constructed as a + * local and move-relocated into NetBootstrap (see + * NetBootstrap.cpp), so a `this` pointer captured at start() + * time would go stale once that local's stack frame returns — + * same problem SetupWebServer's routeContextStorage() solves. + * + * @author Michele Bigi + * @date 2026-08-07 + */ +[[nodiscard]] std::atomic& activeListenFd() noexcept +{ + static std::atomic fd{-1}; + return fd; +} + +constexpr std::uint16_t kProgRamStart = 0x0400U; +constexpr std::uint16_t kProgRamEnd = 0x07FFU; +constexpr std::uint16_t kCtrlRegStart = 0x0800U; +constexpr std::uint16_t kCoreControlReg = 0x081CU; +constexpr std::uint8_t kDspRunBit = 0x04U; +constexpr unsigned kWordBytesParam = 4U; +constexpr unsigned kWordsPerSafeload = 5U; + +constexpr std::size_t kWriteHeaderSize = 10U; +constexpr std::size_t kReadReqHeaderSize = 8U; +constexpr std::size_t kReadRespHeaderSize = 9U; +constexpr std::uint16_t kMaxReadBytes = 256U; + +constexpr std::size_t kMaxCaptureRegions = 32U; // core::DspProgramBlob kMaxWriteCount +constexpr std::size_t kMaxRegionPayload = 16U * 1024U; // kMaxWritePayload + +[[nodiscard]] unsigned wordSizeForAddress(std::uint16_t address) noexcept +{ + if (address >= kProgRamStart && address <= kProgRamEnd) { + return 5U; + } + if (address >= kCtrlRegStart) { + return 2U; + } + return 4U; +} + +[[nodiscard]] std::uint16_t readBe16(const std::uint8_t* p) noexcept +{ + return static_cast((static_cast(p[0]) << 8) + | p[1]); +} + +void writeBe16(std::uint8_t* p, std::uint16_t value) noexcept +{ + p[0] = static_cast((value >> 8) & 0xFFU); + p[1] = static_cast(value & 0xFFU); +} + +/** + * @brief PendingRegion — one coalesced contiguous write during a Download. + */ +struct PendingRegion { + std::uint16_t address; + std::vector data; +}; + +/** + * @brief DownloadCapture — coalesces a Link Compile Download for persistence. + * + * Merges contiguous direct (non-safeload) DSP writes into a handful of + * regions (mirroring the ~5-block shape of EmbeddedDspProgramSource), then + * on finish() serialises and stores them via FlashDspProgramSource so the + * downloaded program becomes what DigiRadio boots with next time. Bails + * out (does not persist) if the session doesn't fit the DRAD blob's own + * caps — the DSP still runs fine from what was already written live. + */ +class DownloadCapture { +public: + void addWrite(std::uint16_t address, std::span data) + { + if (overflowed_ || data.empty()) { + return; + } + if (tryExtendLast(address, data)) { + return; + } + if (regions_.size() >= kMaxCaptureRegions) { + abandon(); + return; + } + regions_.push_back(PendingRegion{ + address, std::vector(data.begin(), data.end())}); + } + + void finish() + { + if (!overflowed_ && !regions_.empty()) { + persist(); + } + regions_.clear(); + overflowed_ = false; + } + +private: + [[nodiscard]] bool tryExtendLast(std::uint16_t address, + std::span data) + { + if (regions_.empty()) { + return false; + } + PendingRegion& last = regions_.back(); + const unsigned wordSize = wordSizeForAddress(last.address); + const auto lastWords = + static_cast(last.data.size() / wordSize); + const std::uint32_t lastEnd = + static_cast(last.address) + lastWords; + if (lastEnd != address + || last.data.size() + data.size() > kMaxRegionPayload) { + return false; + } + last.data.insert(last.data.end(), data.begin(), data.end()); + return true; + } + + void abandon() + { + overflowed_ = true; + regions_.clear(); + ESP_LOGW(kTag, + "Download too fragmented to persist as boot program — " + "DSP still runs live, only reboot-persistence is skipped"); + } + + void persist() + { + std::vector writes; + writes.reserve(regions_.size()); + for (auto& region : regions_) { + writes.emplace_back(region.address, std::move(region.data)); + } + const core::DspProgram program(std::move(writes)); + const std::vector blob = + core::serializeDspProgramBlob(program); + if (auto stored = adau1701::FlashDspProgramSource::storeBlob(blob); + !stored) { + ESP_LOGW(kTag, "SigmaStudio download not persisted (flash store failed)"); + return; + } + ESP_LOGI(kTag, + "SigmaStudio download persisted as boot program (%u bytes)", + static_cast(blob.size())); + } + + std::vector regions_; + bool overflowed_ = false; +}; + +/** + * @brief ConnectionState — per-TCP-connection Download tracking. + */ +struct ConnectionState { + DownloadCapture capture; + bool dspRunning = false; +}; + +void directWrite(std::uint16_t address, std::span data) +{ + if (data.empty()) { + return; + } + sigma_studio_lock(); + SIGMA_WRITE_REGISTER_BLOCK( + 0U, address, static_cast(data.size()), + const_cast( + reinterpret_cast(data.data()))); + sigma_studio_unlock(); +} + +void safeloadWrite(std::uint16_t address, std::span data) +{ + const auto totalWords = + static_cast(data.size() / kWordBytesParam); + unsigned offset = 0U; + sigma_studio_lock(); + while (offset < totalWords) { + const unsigned words = + std::min(totalWords - offset, kWordsPerSafeload); + unsigned addrs[kWordsPerSafeload]; + for (unsigned i = 0U; i < words; ++i) { + addrs[i] = static_cast(address) + offset + i; + } + sigma_safeload_raw_block( + static_cast(words), addrs, + data.data() + static_cast(offset) * kWordBytesParam); + offset += words; + } + sigma_studio_unlock(); +} + +void trackDownloadCompletion(std::uint16_t address, + std::span payload, + ConnectionState& state) +{ + if (address != kCoreControlReg || payload.size() < 2U) { + return; + } + const bool wasRunning = state.dspRunning; + state.dspRunning = (payload.back() & kDspRunBit) != 0U; + if (!wasRunning && state.dspRunning) { + state.capture.finish(); + } +} + +void dispatchWrite(std::uint16_t address, std::span payload, + std::uint8_t safeload, ConnectionState& state) +{ + if (safeload != 0U) { + safeloadWrite(address, payload); + return; + } + if (!state.dspRunning) { + state.capture.addWrite(address, payload); + } + directWrite(address, payload); + trackDownloadCompletion(address, payload, state); +} + +[[nodiscard]] std::size_t tryConsumeWrite(const std::uint8_t* p, + std::size_t avail, + ConnectionState& state) +{ + if (avail < kWriteHeaderSize) { + return 0U; + } + const std::uint16_t totalLen = readBe16(p + 3U); + if (totalLen < kWriteHeaderSize) { + return 1U; // malformed frame — resync by one byte + } + if (avail < totalLen) { + return 0U; + } + + const std::uint8_t safeload = p[1]; + const std::uint8_t chipAddr = p[5]; + const std::uint16_t dataLen = readBe16(p + 6U); + const std::uint16_t address = readBe16(p + 8U); + + const std::uint16_t maxPayload = + static_cast(totalLen - kWriteHeaderSize); + const std::uint16_t safeLen = std::min(dataLen, maxPayload); + + if (isDspChipAddr(chipAddr)) { + const std::span payload(p + kWriteHeaderSize, + safeLen); + dispatchWrite(address, payload, safeload, state); + } + return totalLen; +} + +void sendReadResponse(int clientFd, std::uint8_t chipAddr, + std::uint16_t address, std::uint16_t requested) +{ + const std::uint16_t length = std::min(requested, kMaxReadBytes); + std::vector data(length); + + sigma_studio_lock(); + const int result = + length == 0U ? 0 : sigma_i2c_read(address, data.data(), length); + sigma_studio_unlock(); + if (result != 0) { + ESP_LOGW(kTag, + "read 0x%04x len=%u chipAddr=0x%02x: sigma_i2c_read failed", + static_cast(address), + static_cast(length), + static_cast(chipAddr)); + return; + } + + std::vector resp(kReadRespHeaderSize + length); + resp[0] = kCtrlReadResp; + writeBe16(resp.data() + 1U, + static_cast(kReadRespHeaderSize + length)); + resp[3] = chipAddr; + writeBe16(resp.data() + 4U, length); + writeBe16(resp.data() + 6U, address); + resp[8] = 0x01U; + std::memcpy(resp.data() + kReadRespHeaderSize, data.data(), length); + const ssize_t sent = send(clientFd, resp.data(), resp.size(), 0); + ESP_LOGI(kTag, + "read 0x%04x len=%u chipAddr=0x%02x: sent %d/%u resp bytes", + static_cast(address), static_cast(length), + static_cast(chipAddr), static_cast(sent), + static_cast(resp.size())); +} + +[[nodiscard]] std::size_t tryConsumeRead(const std::uint8_t* p, + std::size_t avail, int clientFd) +{ + if (avail < kReadReqHeaderSize) { + return 0U; + } + const std::uint16_t totalLen = readBe16(p + 1U); + if (totalLen < kReadReqHeaderSize) { + return 1U; // malformed frame — resync by one byte + } + if (avail < totalLen) { + return 0U; + } + + const std::uint8_t chipAddr = p[3]; + const std::uint16_t dataLen = readBe16(p + 4U); + const std::uint16_t address = readBe16(p + 6U); + if (isDspChipAddr(chipAddr)) { + sendReadResponse(clientFd, chipAddr, address, dataLen); + } else { + ESP_LOGW(kTag, + "read req dropped: chipAddr=0x%02x not DSP (want 0x%02x or " + "0x%02x), addr=0x%04x len=%u", + static_cast(chipAddr), + static_cast(kChipAddrDsp), + static_cast(kDspI2cAddr7), + static_cast(address), + static_cast(dataLen)); + } + return totalLen; +} + +[[nodiscard]] std::size_t processBuffer(std::uint8_t* buf, std::size_t len, + int clientFd, ConnectionState& state) +{ + std::size_t pos = 0U; + while (pos < len) { + const std::uint8_t ctrl = buf[pos]; + std::size_t consumed = 0U; + if (ctrl == kCtrlWrite) { + consumed = tryConsumeWrite(buf + pos, len - pos, state); + } else if (ctrl == kCtrlReadReq) { + consumed = tryConsumeRead(buf + pos, len - pos, clientFd); + } else { + ESP_LOGW(kTag, "unrecognized ctrl byte 0x%02x — resyncing", + static_cast(ctrl)); + consumed = 1U; + } + if (consumed == 0U) { + break; + } + pos += consumed; + } + return pos; +} + +/** @brief Diagnostic: hex-dump up to the first 48 bytes of a receive. */ +void logRxHexDump(const std::uint8_t* p, std::size_t len) +{ + constexpr std::size_t kMaxDump = 48U; + char hex[3U * kMaxDump + 1U]; + const std::size_t n = std::min(len, kMaxDump); + for (std::size_t i = 0U; i < n; ++i) { + std::snprintf(hex + i * 3U, 4U, "%02x ", static_cast(p[i])); + } + ESP_LOGI(kTag, "rx %u bytes: %s%s", static_cast(len), hex, + len > kMaxDump ? "..." : ""); +} + +void serveClient(int clientFd) +{ + ConnectionState state; + std::vector buf(kRecvBufSize); + std::size_t len = 0U; + + while (true) { + const ssize_t received = + recv(clientFd, buf.data() + len, buf.size() - len, 0); + if (received <= 0) { + break; + } + logRxHexDump(buf.data() + len, static_cast(received)); + len += static_cast(received); + + const std::size_t consumed = processBuffer(buf.data(), len, clientFd, state); + if (consumed > 0U && consumed < len) { + std::memmove(buf.data(), buf.data() + consumed, len - consumed); + } + len = consumed <= len ? len - consumed : 0U; + } +} + +} // namespace + +SigmaStudioTcpServer::SigmaStudioTcpServer() + : listenFd_(-1) + , task_(nullptr) +{ +} + +SigmaStudioTcpServer::~SigmaStudioTcpServer() +{ + stop(); +} + +SigmaStudioTcpServer::SigmaStudioTcpServer(SigmaStudioTcpServer&& other) noexcept + : listenFd_(other.listenFd_) + , task_(other.task_) +{ + other.listenFd_ = -1; + other.task_ = nullptr; +} + +SigmaStudioTcpServer& +SigmaStudioTcpServer::operator=(SigmaStudioTcpServer&& other) noexcept +{ + if (this != &other) { + stop(); + listenFd_ = other.listenFd_; + task_ = other.task_; + other.listenFd_ = -1; + other.task_ = nullptr; + } + return *this; +} + +void SigmaStudioTcpServer::stop() noexcept +{ + if (task_ != nullptr) { + vTaskDelete(task_); + task_ = nullptr; + } + activeListenFd().store(-1, std::memory_order_release); + if (listenFd_ >= 0) { + close(listenFd_); + listenFd_ = -1; + } +} + +std::expected SigmaStudioTcpServer::start() +{ + if (task_ != nullptr) { + return {}; + } + + const int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (fd < 0) { + ESP_LOGE(kTag, "socket() failed"); + return std::unexpected(NetError::TcpServerStartFailed); + } + + const int reuse = 1; + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)); + + sockaddr_in addr{}; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_port = htons(kPort); + + if (bind(fd, reinterpret_cast(&addr), sizeof(addr)) != 0 + || listen(fd, 1) != 0) { + ESP_LOGE(kTag, "bind/listen failed"); + close(fd); + return std::unexpected(NetError::TcpServerStartFailed); + } + listenFd_ = fd; + activeListenFd().store(fd, std::memory_order_release); + + const BaseType_t created = + xTaskCreate(&SigmaStudioTcpServer::acceptLoopTask, "sigma_tcp", + kTaskStackBytes, nullptr, kTaskPriority, &task_); + if (created != pdPASS) { + ESP_LOGE(kTag, "xTaskCreate failed"); + activeListenFd().store(-1, std::memory_order_release); + close(listenFd_); + listenFd_ = -1; + task_ = nullptr; + return std::unexpected(NetError::TcpServerStartFailed); + } + + ESP_LOGI(kTag, "SigmaStudio TCP bridge listening on port %u", + static_cast(kPort)); + return {}; +} + +void SigmaStudioTcpServer::acceptLoopTask(void* /*arg*/) +{ + while (true) { + const int listenFd = activeListenFd().load(std::memory_order_acquire); + sockaddr_in clientAddr{}; + socklen_t clientLen = sizeof(clientAddr); + const int clientFd = accept( + listenFd, reinterpret_cast(&clientAddr), &clientLen); + if (clientFd < 0) { + ESP_LOGW(kTag, "accept() failed: errno=%d", errno); + vTaskDelay(pdMS_TO_TICKS(100)); + continue; + } + ESP_LOGI(kTag, "SigmaStudio client connected"); + serveClient(clientFd); + ESP_LOGI(kTag, "SigmaStudio client disconnected"); + close(clientFd); + } +} + +} // namespace net diff --git a/Software/components/net/src/SoftApHost.cpp b/Software/components/net/src/SoftApHost.cpp index 9691169..500d060 100644 --- a/Software/components/net/src/SoftApHost.cpp +++ b/Software/components/net/src/SoftApHost.cpp @@ -18,6 +18,7 @@ #include "net/SoftApHost.hpp" +#include "esp_netif.h" #include "esp_wifi.h" #include "esp_log.h" @@ -69,11 +70,17 @@ std::expected SoftApHost::start() return {}; } - if (esp_wifi_set_mode(WIFI_MODE_AP) != ESP_OK) { + if (esp_wifi_set_mode(WIFI_MODE_APSTA) != ESP_OK) { ESP_LOGE(kTag, "esp_wifi_set_mode failed"); return std::unexpected(NetError::WifiConfigFailed); } + wifi_config_t staCfg = {}; + if (esp_wifi_set_config(WIFI_IF_STA, &staCfg) != ESP_OK) { + ESP_LOGE(kTag, "esp_wifi_set_config STA failed"); + return std::unexpected(NetError::WifiConfigFailed); + } + wifi_config_t wifiCfg = {}; const std::string_view ssid = config_.ssid(); std::memcpy(wifiCfg.ap.ssid, ssid.data(), ssid.size()); diff --git a/Software/components/net/src/StaClient.cpp b/Software/components/net/src/StaClient.cpp index 946afb9..079a6f5 100644 --- a/Software/components/net/src/StaClient.cpp +++ b/Software/components/net/src/StaClient.cpp @@ -36,9 +36,62 @@ namespace { constexpr char kTag[] = "StaClient"; constexpr int kConnectedBit = BIT0; constexpr int kFailedBit = BIT1; -constexpr TickType_t kConnectTimeout = pdMS_TO_TICKS(30000); +constexpr int kMaxConnectRetries = 10; +constexpr TickType_t kConnectTimeout = pdMS_TO_TICKS(45000); +constexpr TickType_t kRetryDelay = pdMS_TO_TICKS(800); EventGroupHandle_t s_wifiEventGroup = nullptr; +int s_connectRetries = 0; + +/** + * @brief disconnectReasonString — map ESP-IDF Wi-Fi disconnect reason codes. + * + * @dname disconnectReasonString + * @param reason wifi_event_sta_disconnected_t::reason value. + * @return Short English label for logs. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] const char* disconnectReasonString(uint8_t reason) noexcept +{ + switch (reason) { + case WIFI_REASON_AUTH_EXPIRE: + return "auth expired (wrong password?)"; + case WIFI_REASON_NO_AP_FOUND: + return "no AP found (check SSID / 2.4 GHz)"; + case WIFI_REASON_AUTH_FAIL: + return "auth failed (check password)"; + case WIFI_REASON_ASSOC_FAIL: + return "association failed"; + case WIFI_REASON_HANDSHAKE_TIMEOUT: + return "handshake timeout"; + case WIFI_REASON_BEACON_TIMEOUT: + return "beacon timeout (weak signal / PS)"; + case WIFI_REASON_CONNECTION_FAIL: + return "connection failed"; + default: + return "unknown"; + } +} + +/** + * @brief applyStaLinkTuning — stabilise STA link after connect. + * + * @dname applyStaLinkTuning + * @pubstate Disables PS, forces 20 MHz, disables inactive disconnect. + * + * @author Michele Bigi + * @date 2026-08-05 + */ +void applyStaLinkTuning() noexcept +{ + esp_wifi_set_ps(WIFI_PS_NONE); + esp_wifi_set_bandwidth(WIFI_IF_STA, WIFI_BW_HT20); + esp_wifi_set_inactive_time(WIFI_IF_STA, 0); + ESP_LOGI(kTag, "STA link tuning applied (PS off, HT20, inactive off)"); +} /** * @brief wifiEventHandler — signal connect success or failure. @@ -59,29 +112,72 @@ void wifiEventHandler(void* arg, void* eventData) { (void)arg; - (void)eventData; if (eventBase == WIFI_EVENT && eventId == WIFI_EVENT_STA_START) { esp_wifi_connect(); } else if (eventBase == WIFI_EVENT && eventId == WIFI_EVENT_STA_DISCONNECTED) { + const auto* disc = + static_cast(eventData); + const uint8_t reason = disc != nullptr ? disc->reason : 0U; + ESP_LOGW(kTag, "STA disconnected (reason %u: %s)", + static_cast(reason), + disconnectReasonString(reason)); + if (s_wifiEventGroup != nullptr) { + if (s_connectRetries < kMaxConnectRetries) { + ++s_connectRetries; + ESP_LOGI(kTag, "retrying STA connect (%d/%d)", + s_connectRetries, kMaxConnectRetries); + vTaskDelay(kRetryDelay); + esp_wifi_connect(); + return; + } xEventGroupSetBits(s_wifiEventGroup, kFailedBit); + return; } + + ESP_LOGW(kTag, "STA link lost — reconnecting"); + esp_wifi_connect(); } else if (eventBase == IP_EVENT && eventId == IP_EVENT_STA_GOT_IP) { + const auto* event = + static_cast(eventData); + if (event != nullptr) { + ESP_LOGI(kTag, "STA IP " IPSTR, IP2STR(&event->ip_info.ip)); + } + applyStaLinkTuning(); if (s_wifiEventGroup != nullptr) { xEventGroupSetBits(s_wifiEventGroup, kConnectedBit); } } } + +void unregisterStaHandlers(esp_event_handler_instance_t wifiHandler, + esp_event_handler_instance_t ipHandler) noexcept +{ + if (wifiHandler != nullptr) { + esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, + wifiHandler); + } + if (ipHandler != nullptr) { + esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, + ipHandler); + } +} + } // namespace StaClient::StaClient() : connected_(false) + , wifiHandler_(nullptr) + , ipHandler_(nullptr) { } StaClient::~StaClient() { + unregisterStaHandlers(wifiHandler_, ipHandler_); + wifiHandler_ = nullptr; + ipHandler_ = nullptr; if (connected_) { esp_wifi_stop(); connected_ = false; @@ -90,18 +186,27 @@ StaClient::~StaClient() StaClient::StaClient(StaClient&& other) noexcept : connected_(other.connected_) + , wifiHandler_(other.wifiHandler_) + , ipHandler_(other.ipHandler_) { other.connected_ = false; + other.wifiHandler_ = nullptr; + other.ipHandler_ = nullptr; } StaClient& StaClient::operator=(StaClient&& other) noexcept { if (this != &other) { + unregisterStaHandlers(wifiHandler_, ipHandler_); if (connected_) { esp_wifi_stop(); } connected_ = other.connected_; + wifiHandler_ = other.wifiHandler_; + ipHandler_ = other.ipHandler_; other.connected_ = false; + other.wifiHandler_ = nullptr; + other.ipHandler_ = nullptr; } return *this; } @@ -122,19 +227,18 @@ StaClient::connect(const core::WifiCredentials& creds, std::string_view hostname if (s_wifiEventGroup == nullptr) { return std::unexpected(NetError::StaConnectFailed); } + s_connectRetries = 0; - esp_event_handler_instance_t instanceAnyId = nullptr; - esp_event_handler_instance_t instanceGotIp = nullptr; esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifiEventHandler, nullptr, - &instanceAnyId); + &wifiHandler_); esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifiEventHandler, nullptr, - &instanceGotIp); + &ipHandler_); if (esp_wifi_set_mode(WIFI_MODE_STA) != ESP_OK) { return std::unexpected(NetError::WifiConfigFailed); @@ -150,15 +254,31 @@ StaClient::connect(const core::WifiCredentials& creds, std::string_view hostname wifi_config_t wifiCfg = {}; const std::string_view ssid = creds.ssid().value(); const std::size_t ssidCopy = - std::min(ssid.size(), sizeof(wifiCfg.sta.ssid) - 1); + std::min(ssid.size(), sizeof(wifiCfg.sta.ssid) - 1U); std::memcpy(wifiCfg.sta.ssid, ssid.data(), ssidCopy); + wifiCfg.sta.ssid[ssidCopy] = '\0'; + std::size_t pwdLen = 0U; creds.password().usePlaintext([&](std::string_view pwd) { + pwdLen = pwd.size(); const std::size_t pwdCopy = - std::min(pwd.size(), sizeof(wifiCfg.sta.password) - 1); + std::min(pwd.size(), sizeof(wifiCfg.sta.password) - 1U); std::memcpy(wifiCfg.sta.password, pwd.data(), pwdCopy); + wifiCfg.sta.password[pwdCopy] = '\0'; }); + if (pwdLen == 0U) { + wifiCfg.sta.threshold.authmode = WIFI_AUTH_OPEN; + } else { + wifiCfg.sta.threshold.authmode = WIFI_AUTH_WPA2_WPA3_PSK; + } + wifiCfg.sta.pmf_cfg.capable = true; + wifiCfg.sta.pmf_cfg.required = false; + wifiCfg.sta.scan_method = WIFI_ALL_CHANNEL_SCAN; + wifiCfg.sta.sort_method = WIFI_CONNECT_AP_BY_SIGNAL; + wifiCfg.sta.failure_retry_cnt = 3; + wifiCfg.sta.listen_interval = 1; + if (esp_wifi_set_config(WIFI_IF_STA, &wifiCfg) != ESP_OK) { return std::unexpected(NetError::WifiConfigFailed); } @@ -167,20 +287,22 @@ StaClient::connect(const core::WifiCredentials& creds, std::string_view hostname return std::unexpected(NetError::WifiStartFailed); } + esp_wifi_set_protocol(WIFI_IF_STA, + WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G + | WIFI_PROTOCOL_11N); + esp_wifi_set_ps(WIFI_PS_NONE); + const EventBits_t bits = xEventGroupWaitBits(s_wifiEventGroup, kConnectedBit | kFailedBit, pdTRUE, pdFALSE, kConnectTimeout); - esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, - instanceGotIp); - esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, - instanceAnyId); vEventGroupDelete(s_wifiEventGroup); s_wifiEventGroup = nullptr; if ((bits & kConnectedBit) != 0) { + applyStaLinkTuning(); connected_ = true; if (!hostLabel.empty()) { if (mdns_init() == ESP_OK) { @@ -192,6 +314,9 @@ StaClient::connect(const core::WifiCredentials& creds, std::string_view hostname return {}; } + unregisterStaHandlers(wifiHandler_, ipHandler_); + wifiHandler_ = nullptr; + ipHandler_ = nullptr; esp_wifi_stop(); ESP_LOGW(kTag, "STA connect timed out or failed"); if ((bits & kFailedBit) != 0) { diff --git a/Software/components/net/src/WifiScanner.cpp b/Software/components/net/src/WifiScanner.cpp new file mode 100644 index 0000000..0346176 --- /dev/null +++ b/Software/components/net/src/WifiScanner.cpp @@ -0,0 +1,220 @@ +/** + * @file WifiScanner.cpp + * @brief WifiScanner implementation. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-08-05 + */ + +#include "net/WifiScanner.hpp" + +#include "esp_log.h" +#include "esp_netif.h" +#include "esp_wifi.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#include +#include +#include +#include + +namespace net { + +namespace { +constexpr char kTag[] = "WifiScanner"; + +/** + * @brief authToken — map ESP-IDF auth mode to a short API token. + * + * @dname authToken + * @param auth wifi_ap_record_t::authmode value. + * @return Stable lowercase token for JSON. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] const char* authToken(wifi_auth_mode_t auth) noexcept +{ + switch (auth) { + case WIFI_AUTH_OPEN: + return "open"; + case WIFI_AUTH_WEP: + return "wep"; + case WIFI_AUTH_WPA_PSK: + return "wpa"; + case WIFI_AUTH_WPA2_PSK: + return "wpa2"; + case WIFI_AUTH_WPA_WPA2_PSK: + return "wpa_wpa2"; + case WIFI_AUTH_WPA2_ENTERPRISE: + return "wpa2_enterprise"; + case WIFI_AUTH_WPA3_PSK: + return "wpa3"; + case WIFI_AUTH_WPA2_WPA3_PSK: + return "wpa2_wpa3"; + case WIFI_AUTH_WAPI_PSK: + return "wapi"; + default: + return "unknown"; + } +} + +/** + * @brief ssidFromRecord — read a possibly unterminated SSID field. + * + * @dname ssidFromRecord + * @param record Raw ESP-IDF scan entry. + * @return SSID string (empty when hidden). + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::string ssidFromRecord(const wifi_ap_record_t& record) +{ + const std::size_t len = + strnlen(reinterpret_cast(record.ssid), sizeof(record.ssid)); + return std::string(reinterpret_cast(record.ssid), len); +} + +/** + * @brief ensureStaNetif — create default STA netif when missing. + * + * @dname ensureStaNetif + * @return true when STA netif exists or was created. + * @pubstate may call esp_netif_create_default_wifi_sta(). + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] bool ensureStaNetif() noexcept +{ + if (esp_netif_get_handle_from_ifkey("WIFI_STA_DEF") != nullptr) { + return true; + } + return esp_netif_create_default_wifi_sta() != nullptr; +} + +/** + * @brief dedupeBySsid — keep strongest RSSI per SSID. + * + * @dname dedupeBySsid + * @param records Raw scan rows from esp_wifi. + * @return Sorted networks, strongest first. + * @pubstate none + * + * @author Michele Bigi + * @date 2026-08-05 + */ +[[nodiscard]] std::vector +dedupeBySsid(const std::vector& records) +{ + std::unordered_map best; + best.reserve(records.size()); + + for (const wifi_ap_record_t& record : records) { + const std::string ssid = ssidFromRecord(record); + if (ssid.empty()) { + continue; + } + + core::WifiScannedNetwork entry = { + .ssid = ssid, + .rssiDbm = record.rssi, + .auth = authToken(record.authmode), + .channel = record.primary, + }; + + const auto existing = best.find(ssid); + if (existing == best.end() || entry.rssiDbm > existing->second.rssiDbm) { + best.emplace(ssid, std::move(entry)); + } + } + + std::vector networks; + networks.reserve(best.size()); + for (auto& item : best) { + networks.push_back(std::move(item.second)); + } + + std::sort(networks.begin(), networks.end(), + [](const core::WifiScannedNetwork& left, + const core::WifiScannedNetwork& right) { + return left.rssiDbm > right.rssiDbm; + }); + return networks; +} + +} // namespace + +std::expected, NetError> +WifiScanner::scanNearby() +{ + wifi_mode_t mode = WIFI_MODE_NULL; + if (esp_wifi_get_mode(&mode) != ESP_OK) { + ESP_LOGE(kTag, "esp_wifi_get_mode failed"); + return std::unexpected(NetError::WifiScanFailed); + } + + if (mode == WIFI_MODE_AP) { + if (!ensureStaNetif()) { + ESP_LOGE(kTag, "STA netif creation failed"); + return std::unexpected(NetError::WifiScanFailed); + } + wifi_config_t staCfg = {}; + if (esp_wifi_set_config(WIFI_IF_STA, &staCfg) != ESP_OK) { + ESP_LOGE(kTag, "STA config for scan failed"); + return std::unexpected(NetError::WifiScanFailed); + } + if (esp_wifi_set_mode(WIFI_MODE_APSTA) != ESP_OK) { + ESP_LOGE(kTag, "APSTA mode switch failed"); + return std::unexpected(NetError::WifiScanFailed); + } + vTaskDelay(pdMS_TO_TICKS(300)); + } + + (void)esp_wifi_scan_stop(); + (void)esp_wifi_clear_ap_list(); + + wifi_scan_config_t scanCfg = {}; + scanCfg.channel = 0; + scanCfg.show_hidden = true; + scanCfg.scan_type = WIFI_SCAN_TYPE_ACTIVE; + scanCfg.scan_time.active.min = 300U; + scanCfg.scan_time.active.max = 1200U; + + const esp_err_t scanErr = esp_wifi_scan_start(&scanCfg, true); + if (scanErr != ESP_OK) { + ESP_LOGE(kTag, "esp_wifi_scan_start failed (%d)", static_cast(scanErr)); + return std::unexpected(NetError::WifiScanFailed); + } + + std::uint16_t count = 0U; + if (esp_wifi_scan_get_ap_num(&count) != ESP_OK) { + ESP_LOGE(kTag, "esp_wifi_scan_get_ap_num failed"); + return std::unexpected(NetError::WifiScanFailed); + } + + std::vector records(count); + if (count > 0U + && esp_wifi_scan_get_ap_records(&count, records.data()) != ESP_OK) { + ESP_LOGE(kTag, "esp_wifi_scan_get_ap_records failed"); + return std::unexpected(NetError::WifiScanFailed); + } + records.resize(count); + + ESP_LOGI(kTag, "raw AP count %u", static_cast(count)); + const auto networks = dedupeBySsid(records); + ESP_LOGI(kTag, "scan found %u unique network(s)", + static_cast(networks.size())); + return networks; +} + +} // namespace net diff --git a/Software/components/net/www/index.html b/Software/components/net/www/index.html index f56a232..a55bf4f 100644 --- a/Software/components/net/www/index.html +++ b/Software/components/net/www/index.html @@ -15,40 +15,87 @@ --text-lg: 1.25rem; --text-xl: 1.75rem; --text-2xl: 2.25rem; - --accent: #c47a2c; - --accent-dim: #8f5a1f; - --bg: #0f1114; - --surface: #1a1d22; - --surface-2: #242830; - --text: #e8eaed; - --muted: #9aa0a6; - --ok: #7cb342; - --err: #e57373; - --radius: 0.5rem; - --font: system-ui, -apple-system, "Segoe UI", sans-serif; + --accent: #ff9a3c; + --accent-2: #ff6a88; + --accent-dim: #c4701f; + --bg: #0b0c10; + --surface: #16181d; + --surface-2: #1e2128; + --surface-3: #262a33; + --border: #2a2e37; + --text: #f1f2f4; + --muted: #9aa0ac; + --ok: #6fd08c; + --err: #ff7a7a; + --radius: 0.85rem; + --radius-sm: 0.55rem; + --shadow: 0 1px 2px rgba(0,0,0,0.3), 0 8px 24px -12px rgba(0,0,0,0.5); + --font: "SF Pro Display", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; + } + :root[data-theme="light"] { + --bg: #f3f2ef; + --surface: #ffffff; + --surface-2: #f6f5f2; + --surface-3: #ececea; + --border: #e4e2dd; + --text: #1c1c1e; + --muted: #6b6f76; + --shadow: 0 1px 2px rgba(20,20,20,0.05), 0 10px 24px -16px rgba(20,20,20,0.25); + } + @media (prefers-color-scheme: light) { + :root:not([data-theme="dark"]) { + --bg: #f3f2ef; + --surface: #ffffff; + --surface-2: #f6f5f2; + --surface-3: #ececea; + --border: #e4e2dd; + --text: #1c1c1e; + --muted: #6b6f76; + --shadow: 0 1px 2px rgba(20,20,20,0.05), 0 10px 24px -16px rgba(20,20,20,0.25); + } } * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: var(--font); font-size: var(--text-base); line-height: 1.5; - background: var(--bg); + background: + radial-gradient(1200px 480px at 15% -10%, color-mix(in srgb, var(--accent) 14%, transparent), transparent), + var(--bg); color: var(--text); min-height: 100vh; padding: var(--space-2); + -webkit-font-smoothing: antialiased; } .shell { - max-width: 40rem; + max-width: 42rem; margin: 0 auto; } header { - background: var(--surface); + background: linear-gradient(155deg, var(--surface) 0%, var(--surface-2) 100%); + border: 1px solid var(--border); border-radius: var(--radius); padding: var(--space-3); - border-top: 3px solid var(--accent); margin-bottom: var(--space-2); + box-shadow: var(--shadow); + position: relative; + overflow: hidden; + } + header::before { + content: ""; + position: absolute; + inset: 0 0 auto 0; + height: 3px; + background: linear-gradient(90deg, var(--accent), var(--accent-2)); + } + header h1 { + font-size: var(--text-xl); + font-weight: 700; + letter-spacing: -0.02em; + background: linear-gradient(90deg, var(--text), var(--text) 60%, var(--accent)); + -webkit-background-clip: text; + background-clip: text; } - header h1 { font-size: var(--text-xl); font-weight: 600; } .meta { display: flex; flex-wrap: wrap; @@ -59,105 +106,171 @@ color: var(--muted); } .dot { - width: 0.55rem; - height: 0.55rem; + width: 0.5rem; + height: 0.5rem; border-radius: 50%; background: var(--accent); flex-shrink: 0; + box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 25%, transparent); } .chips { display: flex; flex-wrap: wrap; gap: var(--space-1); } .chip { font-size: 0.75rem; - padding: 0.15rem 0.45rem; + font-weight: 500; + padding: 0.2rem 0.55rem; border-radius: 999px; - background: var(--surface-2); + background: var(--surface-3); color: var(--muted); + border: 1px solid var(--border); } - .chip.on { color: var(--ok); border: 1px solid var(--ok); } - .chip.off { opacity: 0.55; } + .chip.on { color: var(--ok); border-color: color-mix(in srgb, var(--ok) 45%, var(--border)); } + .chip.off { opacity: 0.5; } nav.tabs { display: flex; flex-wrap: wrap; - gap: 0.35rem; + gap: 0.3rem; margin-bottom: var(--space-2); + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 0.3rem; + box-shadow: var(--shadow); } nav.tabs button { flex: 1 1 auto; - min-width: 4.5rem; - padding: 0.55rem 0.65rem; - border: 1px solid #333; - border-radius: var(--radius); - background: var(--surface); + min-width: 4rem; + padding: 0.55rem 0.6rem; + border: none; + border-radius: var(--radius-sm); + background: transparent; color: var(--muted); font: inherit; font-size: var(--text-sm); + font-weight: 500; cursor: pointer; + transition: background 0.15s, color 0.15s; } + nav.tabs button:hover { color: var(--text); } nav.tabs button.active { - color: var(--text); - border-color: var(--accent); - background: var(--surface-2); + color: var(--bg); + background: linear-gradient(135deg, var(--accent), var(--accent-2)); + font-weight: 600; + box-shadow: 0 4px 12px -4px color-mix(in srgb, var(--accent) 60%, transparent); } .panel { display: none; background: var(--surface); + border: 1px solid var(--border); border-radius: var(--radius); padding: var(--space-3); + box-shadow: var(--shadow); + animation: panel-in 0.18s ease-out; + } + @keyframes panel-in { + from { opacity: 0; transform: translateY(4px); } + to { opacity: 1; transform: translateY(0); } } .panel.active { display: block; } h2 { font-size: var(--text-lg); - font-weight: 600; + font-weight: 700; + letter-spacing: -0.01em; margin-bottom: var(--space-1); } + h3.subhead { + font-size: var(--text-base); + font-weight: 600; + margin: var(--space-3) 0 var(--space-1); + padding-top: var(--space-2); + border-top: 1px solid var(--border); + } .lede { color: var(--muted); font-size: var(--text-sm); margin-bottom: var(--space-2); } + .hint { + color: var(--muted); + font-size: var(--text-sm); + margin-bottom: var(--space-1); + } + .bt-guide { + margin-bottom: var(--space-2); + padding: var(--space-2); + border: 1px solid var(--border); + border-radius: var(--radius-sm); + background: var(--surface-2); + font-size: var(--text-sm); + } + .bt-guide summary { cursor: pointer; font-weight: 600; } + .bt-guide ol { + margin: var(--space-1) 0 0 1.25rem; + padding: 0; + } + .bt-guide li { margin-bottom: 0.35rem; } label { display: block; font-size: var(--text-sm); + font-weight: 500; color: var(--muted); - margin-bottom: 0.25rem; + margin-bottom: 0.3rem; } input, select { width: 100%; - padding: var(--space-1) var(--space-2); + padding: 0.65rem var(--space-2); margin-bottom: var(--space-2); - border: 1px solid #333; - border-radius: var(--radius); - background: var(--bg); + border: 1px solid var(--border); + border-radius: var(--radius-sm); + background: var(--surface-2); color: var(--text); font: inherit; + transition: border-color 0.15s, box-shadow 0.15s; + } + input:focus, select:focus { + outline: none; + border-color: var(--accent); + box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 20%, transparent); } input[type="file"] { padding: var(--space-1); font-size: var(--text-sm); } input[type="range"] { padding: 0; accent-color: var(--accent); } + input[type="checkbox"] { + width: auto; + margin: 0 0.4rem 0 0; + accent-color: var(--accent); + vertical-align: middle; + } button.action { width: 100%; - padding: var(--space-2); + padding: 0.75rem var(--space-2); border: none; - border-radius: var(--radius); - background: var(--accent); - color: var(--bg); + border-radius: var(--radius-sm); + background: linear-gradient(135deg, var(--accent), var(--accent-2)); + color: #1a1206; font: inherit; - font-weight: 600; + font-weight: 700; cursor: pointer; + transition: transform 0.1s, box-shadow 0.15s, opacity 0.15s; + box-shadow: 0 4px 14px -6px color-mix(in srgb, var(--accent) 55%, transparent); } + button.action:hover { transform: translateY(-1px); } + button.action:active { transform: translateY(0); } button.action.secondary { - background: transparent; - color: var(--accent); - border: 1px solid var(--accent); + background: var(--surface-2); + color: var(--text); + border: 1px solid var(--border); + box-shadow: none; } - button.action:disabled { opacity: 0.55; cursor: wait; } + button.action.secondary:hover { border-color: var(--accent); } + button.action:disabled { opacity: 0.5; cursor: wait; transform: none; } button.action.compact { width: auto; padding: 0.35rem 0.65rem; font-size: var(--text-sm); - font-weight: 500; + font-weight: 600; + box-shadow: none; } .row { display: flex; gap: var(--space-2); margin-bottom: var(--space-2); } .row .action { flex: 1; } @@ -170,13 +283,14 @@ .msg.err { color: var(--err); } code { font-size: 0.9em; - background: var(--bg); - padding: 0.1em 0.35em; - border-radius: 0.25rem; + background: var(--surface-3); + padding: 0.1em 0.4em; + border-radius: 0.3rem; } .now-title { font-size: var(--text-2xl); - font-weight: 600; + font-weight: 700; + letter-spacing: -0.02em; line-height: 1.2; margin-bottom: var(--space-1); word-break: break-word; @@ -195,12 +309,14 @@ margin-bottom: var(--space-2); } .stat { - background: var(--bg); - border-radius: var(--radius); - padding: var(--space-1) var(--space-2); + background: var(--surface-2); + border: 1px solid var(--border); + border-radius: var(--radius-sm); + padding: 0.6rem var(--space-2); font-size: var(--text-sm); + font-weight: 600; } - .stat span { display: block; color: var(--muted); font-size: 0.75rem; } + .stat span { display: block; color: var(--muted); font-size: 0.7rem; font-weight: 500; margin-bottom: 0.1rem; } .band-panel { display: none; } .band-panel.show { display: block; } ul.list { @@ -214,10 +330,11 @@ justify-content: space-between; align-items: center; gap: var(--space-1); - padding: var(--space-1) 0; - border-bottom: 1px solid #2a2d33; + padding: 0.6rem 0; + border-bottom: 1px solid var(--border); font-size: var(--text-sm); } + ul.list li:last-child { border-bottom: none; } ul.list li .label { flex: 1; min-width: 0; @@ -229,6 +346,48 @@ gap: 0.25rem; justify-content: flex-end; } + ul.pick-list { + list-style: none; + margin-bottom: var(--space-2); + max-height: 16rem; + overflow-y: auto; + } + ul.pick-list li.pick-item { + display: block; + padding: var(--space-2); + margin-bottom: var(--space-1); + border: 1px solid var(--border); + border-radius: var(--radius-sm); + background: var(--surface-2); + cursor: pointer; + font-size: var(--text-sm); + transition: border-color 0.15s, background 0.15s; + } + ul.pick-list li.pick-item:hover { + border-color: var(--accent); + } + ul.pick-list li.pick-item.selected { + border-color: var(--accent); + background: color-mix(in srgb, var(--accent) 12%, var(--surface-2)); + box-shadow: inset 0 0 0 1px var(--accent); + } + ul.pick-list li.pick-item .pick-title { + font-weight: 600; + word-break: break-word; + } + ul.pick-list li.pick-item .pick-meta { + margin-top: 0.2rem; + color: var(--muted); + font-size: 0.75rem; + } + ul.pick-list li.pick-hint { + padding: var(--space-2); + color: var(--muted); + font-size: var(--text-sm); + border: 1px dashed var(--border); + border-radius: var(--radius-sm); + text-align: center; + } .eq-band { display: grid; grid-template-columns: 4rem 1fr 3rem; @@ -254,6 +413,59 @@ text-align: right; color: var(--muted); } + .switch-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-2); + margin-bottom: var(--space-2); + } + .switch-row .switch-label { flex: 1; } + .switch-row .switch-label strong { display: block; color: var(--text); font-size: var(--text-base); font-weight: 600; } + .switch-row .switch-label span { display: block; color: var(--muted); font-size: var(--text-sm); margin-top: 0.15rem; } + .switch { + position: relative; + display: inline-block; + width: 3rem; + height: 1.75rem; + flex-shrink: 0; + } + .switch input { + opacity: 0; + width: 100%; + height: 100%; + margin: 0; + position: absolute; + inset: 0; + cursor: pointer; + z-index: 1; + } + .switch .track { + position: absolute; + inset: 0; + background: var(--surface-3); + border: 1px solid var(--border); + border-radius: 999px; + transition: background 0.2s; + } + .switch .thumb { + position: absolute; + top: 0.2rem; + left: 0.2rem; + width: 1.25rem; + height: 1.25rem; + border-radius: 50%; + background: var(--muted); + transition: transform 0.2s, background 0.2s; + } + .switch input:checked ~ .track { + background: color-mix(in srgb, var(--accent) 35%, var(--surface-3)); + border-color: var(--accent); + } + .switch input:checked ~ .thumb { + transform: translateX(1.25rem); + background: linear-gradient(135deg, var(--accent), var(--accent-2)); + } @@ -272,6 +484,7 @@ + @@ -315,6 +528,12 @@

+

Test — cerca stazione

+

FM: seek automatico fino a trovare segnale (e nome RDS se indicato). DAB: prova gli ensemble.

+ + + +

+ +