├── examples ├── HardwareTest │ ├── driver.h │ ├── HardwareTest.ino │ └── lv_hardware_test.h ├── TFT_Clock │ ├── driver.h │ ├── TFT_Clock.ino │ └── TFT_Clock.h ├── LvglBenchmark │ ├── driver.h │ └── LvglBenchmark.ino ├── TFT_eSPI_Clock │ ├── driver.h │ ├── TFT_eSPI_Clock.ino │ └── NotoSansBold15.h ├── TFT_eSPI_GifPlayer │ ├── driver.h │ └── TFT_eSPI_GifPlayer.ino └── TP_firmware_update │ ├── driver.h │ ├── chsc6x_ramcode.h │ └── TP_firmware_update.ino ├── library.properties ├── .github └── workflows │ ├── sync_issues.yml │ └── run-cl-arduino.yml ├── LICENSE ├── README.md ├── src └── lv_xiao_round_screen.h └── lv_conf.h /examples/HardwareTest/driver.h: -------------------------------------------------------------------------------- 1 | #define BOARD_SCREEN_COMBO 501 // Round Display for Seeed Studio XIAO (GC9A01) -------------------------------------------------------------------------------- /examples/TFT_Clock/driver.h: -------------------------------------------------------------------------------- 1 | #define BOARD_SCREEN_COMBO 501 // Round Display for Seeed Studio XIAO (GC9A01) -------------------------------------------------------------------------------- /examples/LvglBenchmark/driver.h: -------------------------------------------------------------------------------- 1 | #define BOARD_SCREEN_COMBO 501 // Round Display for Seeed Studio XIAO (GC9A01) -------------------------------------------------------------------------------- /examples/TFT_eSPI_Clock/driver.h: -------------------------------------------------------------------------------- 1 | #define BOARD_SCREEN_COMBO 501 // Round Display for Seeed Studio XIAO (GC9A01) -------------------------------------------------------------------------------- /examples/TFT_eSPI_GifPlayer/driver.h: -------------------------------------------------------------------------------- 1 | #define BOARD_SCREEN_COMBO 501 // Round Display for Seeed Studio XIAO (GC9A01) -------------------------------------------------------------------------------- /examples/TP_firmware_update/driver.h: -------------------------------------------------------------------------------- 1 | #define BOARD_SCREEN_COMBO 501 // Round Display for Seeed Studio XIAO (GC9A01) -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=Seeed Arduino Round display 2 | version=1.0.0 3 | author=Seeed Studio 4 | maintainer=Seeed Studio 5 | sentence=lvgl based Arduino library for XIAO Round Screen. 6 | paragraph=lvgl based Arduino library for XIAO Round Screen. 7 | category=Display 8 | url=https://github.com/Seeed-Studio/Seeed_Arduino_Round_display_for_XIAO 9 | architectures=* 10 | depends=lvgl,lv_examples,TFT_eSPI,GFX Library for Arduino,I2C BM8563 RTC,SD,AnimatedGIF -------------------------------------------------------------------------------- /examples/TFT_Clock/TFT_Clock.ino: -------------------------------------------------------------------------------- 1 | #include "TFT_Clock.h" 2 | 3 | void setup(void) { 4 | 5 | init_rtc(); 6 | Serial.begin(115200); 7 | lv_xiao_touch_init(); 8 | draw_clock(); 9 | 10 | if (SD.begin(chipSelect)) { 11 | SDstatus = 1; 12 | return; 13 | } 14 | else{ 15 | Serial.println("SD card not inserted or initialization failed!"); 16 | } 17 | } 18 | 19 | void loop() { 20 | sdstatus(); 21 | draw_clock_time(); 22 | get_touch(); 23 | } 24 | -------------------------------------------------------------------------------- /.github/workflows/sync_issues.yml: -------------------------------------------------------------------------------- 1 | name: Automate Issue Management 2 | 3 | on: 4 | issues: 5 | types: 6 | - opened 7 | - edited 8 | - assigned 9 | - unassigned 10 | - labeled 11 | - unlabeled 12 | - reopened 13 | 14 | jobs: 15 | add_issue_to_project: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: Add issue to GitHub Project 19 | uses: actions/add-to-project@v1.0.2 20 | with: 21 | project-url: https://github.com/orgs/Seeed-Studio/projects/17 22 | github-token: ${{ secrets.ISSUE_ASSEMBLE }} 23 | labeled: bug 24 | label-operator: NOT -------------------------------------------------------------------------------- /examples/HardwareTest/HardwareTest.ino: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | // uncomment a library for display driver 4 | #define USE_TFT_ESPI_LIBRARY 5 | // #define USE_ARDUINO_GFX_LIBRARY 6 | 7 | #include "lv_xiao_round_screen.h" 8 | #include "lv_hardware_test.h" 9 | 10 | void setup() 11 | { 12 | Serial.begin( 115200 ); //prepare for possible serial debug 13 | Serial.println( "XIAO round screen - LVGL_Arduino" ); 14 | 15 | lv_init(); 16 | #if LVGL_VERSION_MAJOR == 9 17 | lv_tick_set_cb(millis); 18 | #endif 19 | 20 | lv_xiao_disp_init(); 21 | lv_xiao_touch_init(); 22 | 23 | lv_hardware_test(); 24 | } 25 | 26 | void loop() 27 | { 28 | lv_timer_handler(); //let the GUI do its work 29 | delay( 5 ); 30 | } 31 | -------------------------------------------------------------------------------- /examples/LvglBenchmark/LvglBenchmark.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | // uncomment a library for display driver 4 | #define USE_TFT_ESPI_LIBRARY 5 | // #define USE_ARDUINO_GFX_LIBRARY 6 | 7 | #include "lv_xiao_round_screen.h" 8 | 9 | void setup() 10 | { 11 | Serial.begin( 115200 ); //prepare for possible serial debug 12 | Serial.println( "XIAO round screen - LVGL_Arduino" ); 13 | 14 | lv_init(); 15 | 16 | #if LVGL_VERSION_MAJOR == 9 17 | lv_tick_set_cb(millis); 18 | #endif 19 | 20 | lv_xiao_disp_init(); 21 | lv_xiao_touch_init(); 22 | 23 | // lv_demo_widgets(); 24 | lv_demo_benchmark(); 25 | // lv_demo_keypad_encoder(); 26 | // lv_demo_music(); 27 | // lv_demo_printer(); 28 | // lv_demo_stress(); 29 | } 30 | 31 | void loop() 32 | { 33 | lv_timer_handler(); //let the GUI do its work 34 | delay( 5 ); 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Seeed Studio 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Seeed Studio Round Display for XIAO 2 | ## Introduction 3 | 4 | An Arduino graphics library based on LVGL, specifically designed for [Seeed Studio Round Display for XIAO](https://www.seeedstudio.com/Seeed-Studio-Round-Display-for-XIAO-p-5638.html). Wiki for this product can be found [here](https://wiki.seeedstudio.com/using_lvgl_and_tft_on_round_display/).The dependent TFT_eSPI library is [here](https://github.com/Seeed-Projects/SeeedStudio_TFT_eSPI). 5 | 6 | ## Depends 7 | 8 | lvgl, lv_examples, TFT_eSPI, GFX Library for Arduino, I2C BM8563 RTC, SD, AnimatedGIF 9 | 10 | ## Usage 11 | 12 | 1.Git clone this resp to your Arduino IDE's libraries directory. 13 | 2.Install all the dependencies from the Arduino Library Manager. 14 | 3.Uncomment a library for display driver. 15 | 4.Run the demo "HardTest" on examples directory. 16 | 17 | ## Note 18 | 19 | Please install the dependencies from the Arduino Library Manager. 20 | 21 | If you want to use the TFT_eSPI library for display driving, you must comment out the line `#include ` and uncomment the line `#include ` in the "User_Setup_Select.h" file. 22 | 23 | The lvgl configuration file `lv_conf.h` must be copied to your Arduino IDE's libraries directory. 24 | -------------------------------------------------------------------------------- /.github/workflows/run-cl-arduino.yml: -------------------------------------------------------------------------------- 1 | name: Run Ci Arduino 2 | 3 | on: 4 | push: 5 | pull_request: 6 | repository_dispatch: 7 | types: [trigger-workflow] 8 | 9 | jobs: 10 | ci-arduino: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout repository 15 | uses: actions/checkout@v4 16 | 17 | - name: Checkout script repository 18 | uses: actions/checkout@v4 19 | with: 20 | repository: Seeed-Studio/ci-arduino 21 | path: ci 22 | 23 | 24 | - name: Setup arduino cli 25 | uses: arduino/setup-arduino-cli@v2.0.0 26 | 27 | - name: Create a depend.list file 28 | run: | 29 | # eg: echo "" >> depend.list 30 | # echo "lvgl/lvgl" >> depend.list 31 | # echo "lvgl/lv_demos" >> depend.list 32 | echo "Bodmer/TFT_eSPI" >> depend.list 33 | echo "moononournation/Arduino_GFX" >> depend.list 34 | echo "tanakamasayuki/I2C_BM8563" >> depend.list 35 | echo "arduino-libraries/SD" >> depend.list 36 | echo "bitbank2/AnimatedGIF" >> depend.list 37 | 38 | 39 | 40 | - name: Create a ignore.list file 41 | run: | 42 | # eg: echo "," >> ignore.list 43 | 44 | # seeed_XIAO_m0 RAM and flash is too small 45 | echo "HardwareTest,Seeeduino:samd:seeed_XIAO_m0" >> ignore.list 46 | echo "LvglBenchmark,Seeeduino:samd:seeed_XIAO_m0" >> ignore.list 47 | echo "TFT_Clock,Seeeduino:samd:seeed_XIAO_m0" >> ignore.list 48 | 49 | # XIAO_RA4M1 RAM and flash is too small 50 | echo "HardwareTest,Seeeduino:renesas_uno:XIAO_RA4M1" >> ignore.list 51 | echo "LvglBenchmark,Seeeduino:renesas_uno:XIAO_RA4M1" >> ignore.list 52 | echo "TFT_eSPI_GifPlayer,Seeeduino:renesas_uno:XIAO_RA4M1" >> ignore.list 53 | 54 | # TFT_eSPI not support XIAO_ESP32C6 55 | echo "HardwareTest,esp32:esp32:XIAO_ESP32C6" >> ignore.list 56 | echo "LvglBenchmark,esp32:esp32:XIAO_ESP32C6" >> ignore.list 57 | echo "TFT_Clock,esp32:esp32:XIAO_ESP32C6" >> ignore.list 58 | echo "TFT_eSPI_Clock,esp32:esp32:XIAO_ESP32C6" >> ignore.list 59 | echo "TFT_eSPI_GifPlayer,esp32:esp32:XIAO_ESP32C6" >> ignore.list 60 | 61 | # AnimatedGIF not support XIAO_RP2040 62 | echo "TFT_eSPI_GifPlayer,rp2040:rp2040:seeed_xiao_rp2350" >> ignore.list 63 | 64 | - name: Install lvgl 65 | run: | 66 | mkdir -p /home/runner/Arduino/libraries 67 | git clone --depth 1 https://github.com/lvgl/lvgl /home/runner/Arduino/libraries/lvgl 68 | cp -r /home/runner/Arduino/libraries/lvgl/lv_conf_template.h /home/runner/Arduino/libraries/lv_conf.h 69 | sed -i 's/#if 0/#if 1/' /home/runner/Arduino/libraries/lv_conf.h 70 | sed -i 's/#define LV_USE_DEMO_WIDGETS 0/#define LV_USE_DEMO_WIDGETS 1/' /home/runner/Arduino/libraries/lv_conf.h 71 | sed -i 's/#define LV_USE_DEMO_BENCHMARK 0/#define LV_USE_DEMO_BENCHMARK 1/' /home/runner/Arduino/libraries/lv_conf.h 72 | sed -i 's/#define LV_FONT_MONTSERRAT_26 0/#define LV_FONT_MONTSERRAT_26 1/' /home/runner/Arduino/libraries/lv_conf.h 73 | sed -i 's/#define LV_FONT_MONTSERRAT_14 0/#define LV_FONT_MONTSERRAT_14 1/' /home/runner/Arduino/libraries/lv_conf.h 74 | sed -i 's/#define LV_FONT_MONTSERRAT_20 0/#define LV_FONT_MONTSERRAT_20 1/' /home/runner/Arduino/libraries/lv_conf.h 75 | sed -i 's/#define LV_FONT_MONTSERRAT_24 0/#define LV_FONT_MONTSERRAT_24 1/' /home/runner/Arduino/libraries/lv_conf.h 76 | 77 | ln -s /home/runner/Arduino/libraries/lvgl/demos /home/runner/Arduino/libraries/lvgl/src/demos 78 | 79 | 80 | 81 | # git clone --depth 1 https://github.com/lvgl/lv_demos.git /home/runner/Arduino/libraries/lv_demos 82 | # cp -r /home/runner/Arduino/libraries/lv_demos/lv_demo_conf_template.h /home/runner/Arduino/libraries/lv_demo_conf.h 83 | # sed -i 's/#if 0/#if 1/' /home/runner/Arduino/libraries/lv_demo_conf.h 84 | 85 | 86 | 87 | - name: Build sketch 88 | run: | 89 | ./ci/tools/compile.sh 90 | 91 | - name: Build result 92 | run: | 93 | cat build.log 94 | if [ ${{ github.event_name }} == 'pull_request' ] && [ -f compile.failed ]; then 95 | exit 1 96 | fi 97 | 98 | - name: Generate issue 99 | if: ${{ github.event_name != 'pull_request' }} 100 | run: ./ci/tools/issue.sh 101 | env: 102 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /examples/HardwareTest/lv_hardware_test.h: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include "I2C_BM8563.h" 4 | #include 5 | 6 | // #include 7 | #define NUM_ADC_SAMPLE 20 8 | #define RP2040_VREF 3300 // The actual voltage on 3V3 pin. (unit: mV) 9 | static lv_obj_t *slider_label; 10 | static lv_obj_t *battery_bar, *battery_label; 11 | 12 | I2C_BM8563 rtc(I2C_BM8563_DEFAULT_ADDRESS, Wire); 13 | 14 | int32_t battery_level_percent(void) 15 | { 16 | int32_t mvolts = 0; 17 | #if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) 18 | for(int8_t i=0; i100) ? 100 : level); 39 | return level; 40 | } 41 | 42 | void rtc_clock_cb(lv_timer_t * timer) { 43 | lv_obj_t *rtc_clock = (lv_obj_t *)timer->user_data; 44 | I2C_BM8563_TimeTypeDef tStruct; 45 | rtc.getTime(&tStruct); 46 | char rtc_time[10]; 47 | sprintf(rtc_time, "%d:%d:%d", tStruct.hours, tStruct.minutes, tStruct.seconds); 48 | lv_label_set_text(rtc_clock, rtc_time); 49 | } 50 | 51 | static void event_handler(lv_event_t * e) 52 | { 53 | lv_event_code_t code = lv_event_get_code(e); 54 | lv_obj_t * obj = (lv_obj_t *)lv_event_get_target(e); 55 | if(code == LV_EVENT_VALUE_CHANGED) { 56 | LV_LOG_USER("State: %s\n", lv_obj_has_state(obj, LV_STATE_CHECKED) ? "On" : "Off"); 57 | } 58 | } 59 | 60 | static void hardware_polled_cb(lv_timer_t * timer) { 61 | lv_obj_t *tf_state = (lv_obj_t *)timer->user_data; 62 | if(SD.begin(D2)){ 63 | lv_obj_add_state(tf_state, LV_STATE_CHECKED); 64 | delay(200); 65 | SD.end(); 66 | } else { 67 | lv_obj_clear_state(tf_state, LV_STATE_CHECKED); 68 | } 69 | lv_label_set_text_fmt(battery_label, "%"LV_PRId32"%", battery_level_percent()); 70 | } 71 | 72 | static void slider_event_cb(lv_event_t * e) 73 | { 74 | lv_obj_t * slider = (lv_obj_t *)lv_event_get_target(e); 75 | lv_label_set_text_fmt(slider_label, "%"LV_PRId32, lv_slider_get_value(slider)); 76 | lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15); 77 | } 78 | 79 | void lv_hardware_test(void) 80 | { 81 | lv_obj_t * slider = lv_slider_create(lv_scr_act()); 82 | lv_obj_set_width(slider, 120); 83 | lv_obj_set_pos(slider, 60, 120); 84 | lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL); 85 | slider_label = lv_label_create(lv_scr_act()); 86 | lv_label_set_text(slider_label, "0"); 87 | lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15); 88 | 89 | lv_obj_t * tf_label = lv_label_create(lv_scr_act()); 90 | lv_label_set_text(tf_label, "tf-card"); 91 | lv_obj_set_pos(tf_label, 90, 170); 92 | lv_obj_t * tf_state = lv_switch_create(lv_scr_act()); 93 | lv_obj_set_pos(tf_state, 90, 190); 94 | lv_obj_add_state(tf_state, LV_STATE_CHECKED | LV_STATE_DISABLED); 95 | lv_obj_add_event_cb(tf_state, event_handler, LV_EVENT_ALL, NULL); 96 | lv_timer_create(hardware_polled_cb, 7000, tf_state); 97 | 98 | rtc.begin(); 99 | I2C_BM8563_TimeTypeDef tStruct; 100 | rtc.getTime(&tStruct); 101 | char rtc_time[10]; 102 | sprintf(rtc_time, "%d:%d:%d", tStruct.hours, tStruct.minutes, tStruct.seconds); 103 | lv_obj_t * rtc_clock = lv_label_create(lv_scr_act()); 104 | lv_label_set_text(rtc_clock, rtc_time); 105 | lv_obj_set_pos(rtc_clock, 55, 45); 106 | lv_timer_create(rtc_clock_cb, 1000, rtc_clock); 107 | 108 | 109 | analogReadResolution(12); 110 | #if defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) || defined(ARDUINO_SEEED_XIAO_NRF52840) 111 | analogReference(AR_INTERNAL2V4); // 0.6V ref 1/4 Gain 112 | #endif 113 | 114 | lv_obj_t* battery_outline = lv_obj_create(lv_scr_act()); 115 | lv_obj_set_style_border_width(battery_outline, 2, 0); 116 | lv_obj_set_style_pad_all(battery_outline, 0, 0); 117 | lv_obj_set_style_radius(battery_outline, 8, 0); 118 | lv_obj_clear_flag(battery_outline, LV_OBJ_FLAG_SCROLLABLE); 119 | lv_obj_set_size(battery_outline, 40, 20); 120 | lv_obj_set_pos(battery_outline, 128, 42); 121 | 122 | battery_bar = lv_bar_create(battery_outline); 123 | lv_obj_set_size(battery_bar, 40, 20); 124 | lv_obj_align_to(battery_bar, battery_outline, LV_ALIGN_CENTER, 0, 0); 125 | lv_bar_set_range(battery_bar, 0, 100); 126 | lv_bar_set_value(battery_bar, 80, LV_ANIM_OFF); 127 | // lv_obj_set_style_bg_color(battery_bar, lv_palette_main(LV_PALETTE_GREEN), 0); 128 | 129 | battery_label = lv_label_create(battery_outline); 130 | lv_obj_align_to(battery_label, battery_outline, LV_ALIGN_CENTER, 0, 0); 131 | lv_label_set_text_fmt(battery_label, "80%"); 132 | } 133 | -------------------------------------------------------------------------------- /examples/TFT_Clock/TFT_Clock.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #define USE_TFT_ESPI_LIBRARY 5 | #include "lv_xiao_round_screen.h" 6 | 7 | int SDstatus = 0; 8 | int tftStatus = 0; 9 | 10 | I2C_BM8563 rtc(I2C_BM8563_DEFAULT_ADDRESS, Wire); 11 | const int chipSelect = D2; 12 | 13 | TFT_eSprite face = TFT_eSprite(&tft); 14 | 15 | #define CLOCK_R 260.0f 16 | #define TFT_GREY 0xBDF7 17 | 18 | float sx = 0, sy = 1, mx = 1, my = 0, hx = -1, hy = 0; 19 | float sdeg = 0, mdeg = 0, hdeg = 0; 20 | uint16_t osx = 120, osy = 120, omx = 120, omy = 120, ohx = 120, ohy = 120; 21 | uint16_t x0 = 0, x1 = 0, yy0 = 0, yy1 = 0; 22 | uint32_t targetTime = 0; 23 | 24 | static uint8_t conv2d(const char* p) { 25 | uint8_t v = 0; 26 | if ('0' <= *p && *p <= '9') 27 | v = *p - '0'; 28 | return 10 * v + *++p - '0'; 29 | } 30 | 31 | uint8_t hh = conv2d(__TIME__), mm = conv2d(__TIME__ + 3), ss = conv2d(__TIME__ + 6); 32 | 33 | bool initial = 1; 34 | 35 | void init_rtc() { 36 | Wire.begin(); 37 | rtc.begin(); 38 | I2C_BM8563_DateTypeDef date; 39 | date.month = 11; 40 | date.date = 7; 41 | date.year = 2024; 42 | I2C_BM8563_TimeTypeDef time = {18, 30, 20}; 43 | rtc.setDate(&date); 44 | rtc.setTime(&time); 45 | } 46 | 47 | void sdstatus() { 48 | if (SDstatus == 0) { 49 | tft.setTextSize(2); 50 | tft.setTextDatum(TFT_TRANSPARENT); 51 | tft.setTextColor(TFT_RED); 52 | tft.drawString("SD OFF", CLOCK_R / 2, CLOCK_R * 0.5 + 30); 53 | } 54 | if (SDstatus == 1) { 55 | tft.setTextSize(2); 56 | tft.setTextDatum(TFT_TRANSPARENT); 57 | tft.setTextColor(TFT_GREEN); 58 | tft.drawString("SD ON", CLOCK_R / 2, CLOCK_R * 0.5 + 30); 59 | tftStatus = 1; 60 | } 61 | if (tftStatus == 1) { 62 | tft.init(); 63 | tftStatus = 0; 64 | } 65 | delay(100); 66 | } 67 | 68 | void draw_clock() { 69 | tft.init(); 70 | tft.setRotation(0); 71 | tft.fillScreen(TFT_GREY); 72 | tft.setTextColor(TFT_GREEN, TFT_GREY); 73 | 74 | tft.fillCircle(120, 120, 122, TFT_BLUE); 75 | tft.fillCircle(120, 120, 115, TFT_BLACK); 76 | 77 | for (int i = 0; i < 360; i += 30) { 78 | sx = cos((i - 90) * 0.0174532925); 79 | sy = sin((i - 90) * 0.0174532925); 80 | x0 = sx * 115 + 120; 81 | yy0 = sy * 115 + 120; 82 | x1 = sx * 105 + 120; 83 | yy1 = sy * 105 + 120; 84 | 85 | tft.drawLine(x0, yy0, x1, yy1, TFT_BLUE); 86 | } 87 | 88 | for (int i = 0; i < 360; i += 6) { 89 | sx = cos((i - 90) * 0.0174532925); 90 | sy = sin((i - 90) * 0.0174532925); 91 | x0 = sx * 110 + 120; 92 | yy0 = sy * 110 + 120; 93 | 94 | tft.drawPixel(x0, yy0, TFT_BLUE); 95 | if (i == 0 || i == 180) tft.fillCircle(x0, yy0, 1, TFT_CYAN); 96 | if (i == 0 || i == 180) tft.fillCircle(x0 + 1, yy0, 1, TFT_CYAN); 97 | if (i == 90 || i == 270) tft.fillCircle(x0, yy0, 1, TFT_CYAN); 98 | if (i == 90 || i == 270) tft.fillCircle(x0 + 1, yy0, 1, TFT_CYAN); 99 | } 100 | 101 | tft.fillCircle(120, 120, 3, TFT_RED); 102 | 103 | targetTime = millis() + 1000; 104 | } 105 | 106 | void draw_clock_time() { 107 | I2C_BM8563_DateTypeDef dateStruct; 108 | I2C_BM8563_TimeTypeDef timeStruct; 109 | 110 | rtc.getDate(&dateStruct); 111 | rtc.getTime(&timeStruct); 112 | 113 | int ss = timeStruct.seconds; 114 | int mm = timeStruct.minutes; 115 | int hh = timeStruct.hours; 116 | int dd = dateStruct.date; 117 | int mmnth = dateStruct.month; 118 | 119 | String date = (mmnth < 10 ? "0" : "") + String(mmnth) + "-" + (dd < 10 ? "0" : "") + String(dd); 120 | 121 | tft.setTextSize(2); 122 | tft.setTextDatum(TFT_TRANSPARENT); 123 | tft.setTextColor(TFT_BLUE); 124 | tft.drawString(date, CLOCK_R / 2, CLOCK_R * 0.5 - 30); 125 | 126 | tft.setTextSize(2); 127 | tft.setTextDatum(TFT_TRANSPARENT); 128 | tft.setTextColor(TFT_WHITE); 129 | tft.drawString("TFT_test", CLOCK_R / 2, CLOCK_R * 0.5); 130 | 131 | if (targetTime < millis()) { 132 | targetTime = millis() + 1000; 133 | 134 | int sdeg = ss * 6; 135 | int mdeg = mm * 6 + sdeg * 0.01666667; 136 | int hdeg = hh * 30 + mdeg * 0.0833333; 137 | 138 | float hx = cos((hdeg - 90) * 0.0174532925); 139 | float hy = sin((hdeg - 90) * 0.0174532925); 140 | float mx = cos((mdeg - 90) * 0.0174532925); 141 | float my = sin((mdeg - 90) * 0.0174532925); 142 | float sx = cos((sdeg - 90) * 0.0174532925); 143 | float sy = sin((sdeg - 90) * 0.0174532925); 144 | 145 | if (ss == 0 || initial) { 146 | initial = 0; 147 | tft.drawLine(ohx, ohy, 120, 120, TFT_BLACK); 148 | ohx = hx * 50 + 120; 149 | ohy = hy * 50 + 120; 150 | tft.drawLine(omx, omy, 120, 120, TFT_BLACK); 151 | omx = mx * 70 + 120; 152 | omy = my * 70 + 120; 153 | } 154 | 155 | tft.drawLine(osx, osy, 120, 120, TFT_BLACK); 156 | tft.drawLine(ohx, ohy, 120, 120, TFT_WHITE); 157 | tft.drawLine(omx, omy, 120, 120, TFT_WHITE); 158 | osx = sx * 85 + 120; 159 | osy = sy * 85 + 120; 160 | tft.drawLine(osx, osy, 120, 120, TFT_RED); 161 | 162 | tft.fillCircle(120, 120, 3, TFT_RED); 163 | } 164 | delay(100); 165 | } 166 | 167 | void get_touch() { 168 | lv_coord_t touchX, touchY; 169 | 170 | if (chsc6x_is_pressed()) { 171 | chsc6x_get_xy(&touchX, &touchY); 172 | if (touchX > 240 || touchY > 240) { 173 | touchX = 0; 174 | touchY = 0; 175 | } 176 | Serial.print("Touch coordinates: X = "); 177 | Serial.print(touchX); 178 | Serial.print(", Y = "); 179 | Serial.println(touchY); 180 | tft.fillRect(10, 100, 90, 18, TFT_BLACK); 181 | char buffer1[20]; 182 | sprintf(buffer1, "%d,%d", touchX, touchY); 183 | tft.drawString(buffer1, 10, 100); 184 | } 185 | if (SDstatus == 0) { 186 | delay(400); 187 | } 188 | } 189 | -------------------------------------------------------------------------------- /src/lv_xiao_round_screen.h: -------------------------------------------------------------------------------- 1 | /* display and touch driver for XIAO round screen */ 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #define SCREEN_WIDTH 240 9 | #define SCREEN_HEIGHT 240 10 | #define LVGL_BUFF_SIZE 10 // Number of rows 11 | 12 | #define CHSC6X_I2C_ID 0x2e 13 | #define CHSC6X_MAX_POINTS_NUM 1 14 | #define CHSC6X_READ_POINT_LEN 5 15 | #define TOUCH_INT D7 16 | 17 | #ifndef XIAO_BL 18 | #define XIAO_BL D6 19 | #endif 20 | #define XIAO_DC D3 21 | #define XIAO_CS D1 22 | 23 | uint8_t screen_rotation; 24 | 25 | /* display driver : use TFT_eSPI or Arduino_GFX */ 26 | #if defined(USE_TFT_ESPI_LIBRARY) && defined(USE_ARDUINO_GFX_LIBRARY) 27 | #error "More than one graphics library is defined." 28 | #elif defined(USE_TFT_ESPI_LIBRARY) 29 | #include 30 | TFT_eSPI tft = TFT_eSPI(SCREEN_WIDTH, SCREEN_HEIGHT); 31 | #elif defined(USE_ARDUINO_GFX_LIBRARY) 32 | #include 33 | #define SPI_FREQ 20000000 // SPI bus frequency: 20Mhz 34 | #if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) 35 | Arduino_DataBus *bus = new Arduino_ESP32SPI(XIAO_DC, XIAO_CS, SCK, MOSI, MISO, FSPI); 36 | #elif defined(ARDUINO_Seeed_XIAO_nRF52840_Sense) || defined(ARDUINO_Seeed_XIAO_nRF52840) 37 | Arduino_DataBus *bus = new Arduino_NRFXSPI(XIAO_DC, XIAO_CS, SCK, MOSI, MISO); 38 | #elif defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) || defined(ARDUINO_SEEED_XIAO_NRF52840) 39 | Arduino_DataBus *bus = new Arduino_mbedSPI(XIAO_DC, XIAO_CS); 40 | #elif defined(ARDUINO_SEEED_XIAO_RP2040) 41 | Arduino_DataBus *bus = new Arduino_RPiPicoSPI(XIAO_DC, XIAO_CS, SCK, MOSI, MISO, spi0); 42 | #else 43 | Arduino_DataBus *bus = new Arduino_HWSPI(XIAO_DC, XIAO_CS); 44 | #endif 45 | Arduino_GFX *gfx = new Arduino_GC9A01(bus, -1, screen_rotation, true); 46 | #else 47 | #error "Please define a graphics library for display." 48 | #endif 49 | 50 | #if LVGL_VERSION_MAJOR == 9 51 | void xiao_disp_flush( lv_display_t *disp, const lv_area_t *area, uint8_t *px_map ) 52 | #elif LVGL_VERSION_MAJOR == 8 53 | void xiao_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p ) 54 | #else 55 | #error "Not support LVGL version" 56 | #endif 57 | { 58 | uint32_t w = ( area->x2 - area->x1 + 1 ); 59 | uint32_t h = ( area->y2 - area->y1 + 1 ); 60 | 61 | #if LVGL_VERSION_MAJOR == 9 62 | uint16_t *px_buf = ( uint16_t * )px_map; 63 | #elif LVGL_VERSION_MAJOR == 8 64 | uint16_t *px_buf = ( uint16_t * )&color_p->full; 65 | #endif 66 | 67 | #if defined(USE_TFT_ESPI_LIBRARY) 68 | tft.startWrite(); 69 | tft.setAddrWindow( area->x1, area->y1, w, h ); 70 | tft.pushColors( px_buf, w * h, true ); 71 | tft.endWrite(); 72 | #elif defined(USE_ARDUINO_GFX_LIBRARY) 73 | gfx->draw16bitRGBBitmap(area->x1, area->y1, px_buf, w, h); 74 | #endif 75 | 76 | #if LVGL_VERSION_MAJOR == 9 77 | lv_display_flush_ready(disp); 78 | #elif LVGL_VERSION_MAJOR == 8 79 | lv_disp_flush_ready(disp); 80 | #endif 81 | } 82 | 83 | void xiao_disp_init(void) 84 | { 85 | #if XIAO_BL > 0 86 | pinMode(XIAO_BL, OUTPUT); //Turn on screen backlight 87 | digitalWrite(XIAO_BL, HIGH); 88 | #endif 89 | 90 | #if defined(USE_TFT_ESPI_LIBRARY) 91 | tft.begin(); 92 | tft.setRotation( screen_rotation ); 93 | tft.fillScreen(TFT_BLACK); 94 | #elif defined(USE_ARDUINO_GFX_LIBRARY) 95 | gfx->begin(SPI_FREQ); 96 | gfx->fillScreen(BLACK); 97 | #endif 98 | } 99 | 100 | void lv_xiao_disp_init(void) 101 | { 102 | xiao_disp_init(); 103 | 104 | #if LVGL_VERSION_MAJOR == 9 105 | // static uint8_t draw_buf[ SCREEN_WIDTH * LVGL_BUFF_SIZE * LV_COLOR_DEPTH / 8 ]; 106 | static uint32_t draw_buf[ SCREEN_WIDTH * LVGL_BUFF_SIZE * LV_COLOR_DEPTH / 8 / 4 ]; 107 | lv_display_t * disp = lv_display_create(SCREEN_WIDTH, SCREEN_HEIGHT); 108 | lv_display_set_flush_cb(disp, xiao_disp_flush); 109 | lv_display_set_buffers(disp, (void*)draw_buf, NULL, sizeof(draw_buf), LV_DISPLAY_RENDER_MODE_PARTIAL); 110 | #elif LVGL_VERSION_MAJOR == 8 111 | /*Initialize the display buffer*/ 112 | static lv_disp_draw_buf_t draw_buf; 113 | static lv_color_t buf[ SCREEN_WIDTH * LVGL_BUFF_SIZE ]; 114 | lv_disp_draw_buf_init( &draw_buf, buf, NULL, SCREEN_WIDTH * LVGL_BUFF_SIZE ); 115 | /*Initialize the display driver for lvgl*/ 116 | static lv_disp_drv_t disp_drv; 117 | lv_disp_drv_init( &disp_drv ); 118 | disp_drv.hor_res = SCREEN_WIDTH; 119 | disp_drv.ver_res = SCREEN_HEIGHT; 120 | disp_drv.flush_cb = xiao_disp_flush; 121 | disp_drv.draw_buf = &draw_buf; 122 | lv_disp_drv_register( &disp_drv ); 123 | #endif 124 | } 125 | 126 | 127 | 128 | /* touch driver : chsc6x */ 129 | 130 | bool chsc6x_is_pressed(void) 131 | { 132 | if(digitalRead(TOUCH_INT) != LOW) { 133 | delay(1); 134 | if(digitalRead(TOUCH_INT) != LOW) 135 | return false; 136 | } 137 | return true; 138 | } 139 | 140 | void chsc6x_convert_xy(uint8_t *x, uint8_t *y) 141 | { 142 | uint8_t x_tmp = *x, y_tmp = *y, _end = 0; 143 | for(int i=1; i<=screen_rotation; i++){ 144 | x_tmp = *x; 145 | y_tmp = *y; 146 | _end = (i % 2) ? SCREEN_WIDTH : SCREEN_HEIGHT; 147 | *x = y_tmp; 148 | *y = _end - x_tmp; 149 | } 150 | } 151 | 152 | void chsc6x_get_xy(lv_coord_t * x, lv_coord_t * y) 153 | { 154 | uint8_t temp[CHSC6X_READ_POINT_LEN] = {0}; 155 | uint8_t read_len = Wire.requestFrom(CHSC6X_I2C_ID, CHSC6X_READ_POINT_LEN); 156 | if(read_len == CHSC6X_READ_POINT_LEN){ 157 | Wire.readBytes(temp, read_len); 158 | if (temp[0] == 0x01) { 159 | chsc6x_convert_xy(&temp[2], &temp[4]); 160 | *x = temp[2]; 161 | *y = temp[4]; 162 | } 163 | } 164 | } 165 | 166 | #if LVGL_VERSION_MAJOR == 9 167 | void chsc6x_read( lv_indev_t * indev, lv_indev_data_t * data ) 168 | #elif LVGL_VERSION_MAJOR == 8 169 | void chsc6x_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data ) 170 | #endif 171 | { 172 | lv_coord_t touchX, touchY; 173 | if( !chsc6x_is_pressed() ) 174 | { 175 | data->state = LV_INDEV_STATE_REL; 176 | } else { 177 | data->state = LV_INDEV_STATE_PR; 178 | chsc6x_get_xy(&touchX, &touchY); 179 | /*Set the coordinates*/ 180 | data->point.x = touchX; 181 | data->point.y = touchY; 182 | } 183 | } 184 | 185 | void lv_xiao_touch_init(void) 186 | { 187 | pinMode(TOUCH_INT, INPUT_PULLUP); 188 | Wire.begin(); // Turn on the IIC bus for touch driver 189 | /*Initialize the touch driver for lvgl*/ 190 | #if LVGL_VERSION_MAJOR == 9 191 | lv_indev_t * indev = lv_indev_create(); 192 | lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); 193 | lv_indev_set_read_cb(indev, chsc6x_read); 194 | #elif LVGL_VERSION_MAJOR == 8 195 | static lv_indev_drv_t indev_drv; 196 | lv_indev_drv_init(&indev_drv); 197 | indev_drv.type = LV_INDEV_TYPE_POINTER; 198 | indev_drv.read_cb = chsc6x_read; 199 | lv_indev_drv_register(&indev_drv); 200 | #endif 201 | } 202 | -------------------------------------------------------------------------------- /examples/TFT_eSPI_Clock/TFT_eSPI_Clock.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) 7 | #include "esp_wifi.h" 8 | #include "WiFi.h" 9 | const char *ntpServer = "time.cloudflare.com"; 10 | const char *ssid = "myssid"; 11 | const char *password = "mypassword"; 12 | #endif 13 | 14 | #include "I2C_BM8563.h" 15 | #include "NotoSansBold15.h" 16 | 17 | I2C_BM8563 rtc(I2C_BM8563_DEFAULT_ADDRESS, Wire); 18 | I2C_BM8563_TimeTypeDef timeStruct; 19 | I2C_BM8563_DateTypeDef dateStruct; 20 | 21 | TFT_eSPI tft = TFT_eSPI(); // Invoke library, pins defined in User_Setup.h 22 | TFT_eSprite face = TFT_eSprite(&tft); 23 | 24 | #define CLOCK_X_POS 10 25 | #define CLOCK_Y_POS 10 26 | 27 | #define CLOCK_FG TFT_SKYBLUE 28 | #define CLOCK_BG TFT_NAVY 29 | #define SECCOND_FG TFT_RED 30 | #define LABEL_FG TFT_GOLD 31 | 32 | #define CLOCK_R 230.0f / 2.0f // Clock face radius (float type) 33 | #define H_HAND_LENGTH CLOCK_R/2.0f 34 | #define M_HAND_LENGTH CLOCK_R/1.4f 35 | #define S_HAND_LENGTH CLOCK_R/1.3f 36 | 37 | #define FACE_W CLOCK_R * 2 + 1 38 | #define FACE_H CLOCK_R * 2 + 1 39 | 40 | // Calculate 1 second increment angles. Hours and minute hand angles 41 | // change every second so we see smooth sub-pixel movement 42 | #define SECOND_ANGLE 360.0 / 60.0 43 | #define MINUTE_ANGLE SECOND_ANGLE / 60.0 44 | #define HOUR_ANGLE MINUTE_ANGLE / 12.0 45 | 46 | // Sprite width and height 47 | #define FACE_W CLOCK_R * 2 + 1 48 | #define FACE_H CLOCK_R * 2 + 1 49 | 50 | // Time h:m:s 51 | uint8_t h = 0, m = 0, s = 0; 52 | 53 | float time_secs = h * 3600 + m * 60 + s; 54 | 55 | // Time for next tick 56 | uint32_t targetTime = 0; 57 | 58 | // ========================================================================= 59 | // Setup 60 | // ========================================================================= 61 | void setup() { 62 | Serial.begin(115200); 63 | Serial.println("Booting..."); 64 | 65 | // Initialise the screen 66 | tft.init(); 67 | 68 | // Ideally set orientation for good viewing angle range because 69 | // the anti-aliasing effectiveness varies with screen viewing angle 70 | // Usually this is when screen ribbon connector is at the bottom 71 | tft.setRotation(0); 72 | tft.fillScreen(TFT_BLACK); 73 | 74 | // Create the clock face sprite 75 | //face.setColorDepth(8); // 8 bit will work, but reduces effectiveness of anti-aliasing 76 | face.createSprite(FACE_W, FACE_H); 77 | 78 | // Only 1 font used in the sprite, so can remain loaded 79 | face.loadFont(NotoSansBold15); 80 | 81 | // Draw the whole clock - NTP time not available yet 82 | renderFace(time_secs); 83 | 84 | #if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) 85 | WiFi.begin(ssid, password); 86 | while ( WiFi.status() != WL_CONNECTED ) 87 | { 88 | delay ( 500 ); 89 | Serial.print ( "." ); 90 | } 91 | configTime(8 * 3600, 0, ntpServer); 92 | struct tm timeInfo; 93 | if (getLocalTime(&timeInfo)) { 94 | timeStruct.hours = timeInfo.tm_hour; 95 | timeStruct.minutes = timeInfo.tm_min; 96 | timeStruct.seconds = timeInfo.tm_sec; 97 | rtc.setTime(&timeStruct); 98 | // dateStruct.weekDay = timeInfo.tm_wday; 99 | // dateStruct.month = timeInfo.tm_mon + 1; 100 | // dateStruct.date = timeInfo.tm_mday; 101 | // dateStruct.year = timeInfo.tm_year + 1900; 102 | // rtc.setDate(&dateStruct); 103 | } 104 | #endif 105 | 106 | Wire.begin(); 107 | rtc.begin(); 108 | syncTime(); 109 | } 110 | 111 | // ========================================================================= 112 | // Loop 113 | // ========================================================================= 114 | void loop() { 115 | // Update time periodically 116 | if (targetTime < millis()) { 117 | 118 | // Update next tick time in 100 milliseconds for smooth movement 119 | targetTime = millis() + 100; 120 | 121 | // Increment time by 100 milliseconds 122 | time_secs += 0.100; 123 | 124 | // Midnight roll-over 125 | if (time_secs >= (60 * 60 * 24)) time_secs = 0; 126 | 127 | // All graphics are drawn in sprite to stop flicker 128 | renderFace(time_secs); 129 | 130 | // syncTime(); 131 | } 132 | } 133 | 134 | // ========================================================================= 135 | // Draw the clock face in the sprite 136 | // ========================================================================= 137 | static void renderFace(float t) { 138 | float h_angle = t * HOUR_ANGLE; 139 | float m_angle = t * MINUTE_ANGLE; 140 | float s_angle = t * SECOND_ANGLE; 141 | 142 | // The face is completely redrawn - this can be done quickly 143 | face.fillSprite(TFT_BLACK); 144 | 145 | // Draw the face circle 146 | face.fillSmoothCircle( CLOCK_R, CLOCK_R, CLOCK_R, CLOCK_BG ); 147 | 148 | // Set text datum to middle centre and the colour 149 | face.setTextDatum(MC_DATUM); 150 | 151 | // The background colour will be read during the character rendering 152 | face.setTextColor(CLOCK_FG, CLOCK_BG); 153 | 154 | // Text offset adjustment 155 | constexpr uint32_t dialOffset = CLOCK_R - 10; 156 | 157 | float xp = 0.0, yp = 0.0; // Use float pixel position for smooth AA motion 158 | 159 | // Draw digits around clock perimeter 160 | for (uint32_t h = 1; h <= 12; h++) { 161 | getCoord(CLOCK_R, CLOCK_R, &xp, &yp, dialOffset, h * 360.0 / 12); 162 | face.drawNumber(h, xp, 2 + yp); 163 | } 164 | 165 | // Add text (could be digital time...) 166 | face.setTextColor(LABEL_FG, CLOCK_BG); 167 | face.drawString("TFT_eSPI", CLOCK_R, CLOCK_R * 0.75); 168 | 169 | // Draw minute hand 170 | getCoord(CLOCK_R, CLOCK_R, &xp, &yp, M_HAND_LENGTH, m_angle); 171 | face.drawWideLine(CLOCK_R, CLOCK_R, xp, yp, 6.0f, CLOCK_FG); 172 | face.drawWideLine(CLOCK_R, CLOCK_R, xp, yp, 2.0f, CLOCK_BG); 173 | 174 | // Draw hour hand 175 | getCoord(CLOCK_R, CLOCK_R, &xp, &yp, H_HAND_LENGTH, h_angle); 176 | face.drawWideLine(CLOCK_R, CLOCK_R, xp, yp, 6.0f, CLOCK_FG); 177 | face.drawWideLine(CLOCK_R, CLOCK_R, xp, yp, 2.0f, CLOCK_BG); 178 | 179 | // Draw the central pivot circle 180 | face.fillSmoothCircle(CLOCK_R, CLOCK_R, 4, CLOCK_FG); 181 | 182 | // Draw cecond hand 183 | getCoord(CLOCK_R, CLOCK_R, &xp, &yp, S_HAND_LENGTH, s_angle); 184 | face.drawWedgeLine(CLOCK_R, CLOCK_R, xp, yp, 2.5, 1.0, SECCOND_FG); 185 | face.pushSprite(5, 5, TFT_TRANSPARENT); 186 | } 187 | 188 | // ========================================================================= 189 | // Get coordinates of end of a line, pivot at x,y, length r, angle a 190 | // ========================================================================= 191 | // Coordinates are returned to caller via the xp and yp pointers 192 | #define DEG2RAD 0.0174532925 193 | void getCoord(int16_t x, int16_t y, float *xp, float *yp, int16_t r, float a) 194 | { 195 | float sx1 = cos( (a - 90) * DEG2RAD); 196 | float sy1 = sin( (a - 90) * DEG2RAD); 197 | *xp = sx1 * r + x; 198 | *yp = sy1 * r + y; 199 | } 200 | 201 | void syncTime(void){ 202 | targetTime = millis() + 100; 203 | rtc.getTime(&timeStruct); 204 | time_secs = timeStruct.hours * 3600 + timeStruct.minutes * 60 + timeStruct.seconds; 205 | } 206 | -------------------------------------------------------------------------------- /examples/TFT_eSPI_GifPlayer/TFT_eSPI_GifPlayer.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #ifdef ARDUINO_ARCH_RP2350 8 | #undef PICO_BUILD 9 | #endif 10 | #include "AnimatedGIF.h" 11 | 12 | AnimatedGIF gif; 13 | TFT_eSPI tft = TFT_eSPI(); 14 | 15 | // rule: loop GIF at least during 3s, maximum 5 times, and don't loop/animate longer than 30s per GIF 16 | const int maxLoopIterations = 1; // stop after this amount of loops 17 | const int maxLoopsDuration = 3000; // ms, max cumulated time after the GIF will break loop 18 | const int maxGifDuration =240000; // ms, max GIF duration 19 | 20 | // used to center image based on GIF dimensions 21 | static int xOffset = 0; 22 | static int yOffset = 0; 23 | 24 | static int totalFiles = 0; // GIF files count 25 | static int currentFile = 0; 26 | static int lastFile = -1; 27 | 28 | char GifComment[256]; 29 | 30 | static File FSGifFile; // temp gif file holder 31 | static File GifRootFolder; // directory listing 32 | std::vector GifFiles; // GIF files path 33 | #define DISPLAY_WIDTH 240 34 | 35 | static void MyCustomDelay( unsigned long ms ) { 36 | delay( ms ); 37 | // log_d("delay %d\n", ms); 38 | } 39 | 40 | static void * GIFOpenFile(const char *fname, int32_t *pSize) 41 | { 42 | // log_d("GIFOpenFile( %s )\n", fname ); 43 | FSGifFile = SD.open(fname); 44 | if (FSGifFile) { 45 | *pSize = FSGifFile.size(); 46 | return (void *)&FSGifFile; 47 | } 48 | return NULL; 49 | } 50 | 51 | static void GIFCloseFile(void *pHandle) 52 | { 53 | File *f = static_cast(pHandle); 54 | if (f != NULL) 55 | f->close(); 56 | } 57 | 58 | static int32_t GIFReadFile(GIFFILE *pFile, uint8_t *pBuf, int32_t iLen) 59 | { 60 | int32_t iBytesRead; 61 | iBytesRead = iLen; 62 | File *f = static_cast(pFile->fHandle); 63 | // Note: If you read a file all the way to the last byte, seek() stops working 64 | if ((pFile->iSize - pFile->iPos) < iLen) 65 | iBytesRead = pFile->iSize - pFile->iPos - 1; // <-- ugly work-around 66 | if (iBytesRead <= 0) 67 | return 0; 68 | iBytesRead = (int32_t)f->read(pBuf, iBytesRead); 69 | pFile->iPos = f->position(); 70 | return iBytesRead; 71 | } 72 | 73 | static int32_t GIFSeekFile(GIFFILE *pFile, int32_t iPosition) 74 | { 75 | int i = micros(); 76 | File *f = static_cast(pFile->fHandle); 77 | f->seek(iPosition); 78 | pFile->iPos = (int32_t)f->position(); 79 | i = micros() - i; 80 | // log_d("Seek time = %d us\n", i); 81 | return pFile->iPos; 82 | } 83 | 84 | static void TFTDraw(int x, int y, int w, int h, uint16_t* lBuf ) 85 | { 86 | tft.pushRect( x+xOffset, y+yOffset, w, h, lBuf ); 87 | } 88 | 89 | // Draw a line of image directly on the LCD 90 | void GIFDraw(GIFDRAW *pDraw) 91 | { 92 | uint8_t *s; 93 | uint16_t *d, *usPalette, usTemp[320]; 94 | int x, y, iWidth; 95 | 96 | iWidth = pDraw->iWidth; 97 | if (iWidth > DISPLAY_WIDTH) 98 | iWidth = DISPLAY_WIDTH; 99 | usPalette = pDraw->pPalette; 100 | y = pDraw->iY + pDraw->y; // current line 101 | 102 | s = pDraw->pPixels; 103 | if (pDraw->ucDisposalMethod == 2) {// restore to background color 104 | for (x=0; xucTransparent) 106 | s[x] = pDraw->ucBackground; 107 | } 108 | pDraw->ucHasTransparency = 0; 109 | } 110 | // Apply the new pixels to the main image 111 | if (pDraw->ucHasTransparency) { // if transparency used 112 | uint8_t *pEnd, c, ucTransparent = pDraw->ucTransparent; 113 | int x, iCount; 114 | pEnd = s + iWidth; 115 | x = 0; 116 | iCount = 0; // count non-transparent pixels 117 | while(x < iWidth) { 118 | c = ucTransparent-1; 119 | d = usTemp; 120 | while (c != ucTransparent && s < pEnd) { 121 | c = *s++; 122 | if (c == ucTransparent) { // done, stop 123 | s--; // back up to treat it like transparent 124 | } else { // opaque 125 | *d++ = usPalette[c]; 126 | iCount++; 127 | } 128 | } // while looking for opaque pixels 129 | if (iCount) { // any opaque pixels? 130 | TFTDraw( pDraw->iX+x, y, iCount, 1, (uint16_t*)usTemp ); 131 | x += iCount; 132 | iCount = 0; 133 | } 134 | // no, look for a run of transparent pixels 135 | c = ucTransparent; 136 | while (c == ucTransparent && s < pEnd) { 137 | c = *s++; 138 | if (c == ucTransparent) 139 | iCount++; 140 | else 141 | s--; 142 | } 143 | if (iCount) { 144 | x += iCount; // skip these 145 | iCount = 0; 146 | } 147 | } 148 | } else { 149 | s = pDraw->pPixels; 150 | // Translate the 8-bit pixels through the RGB565 palette (already byte reversed) 151 | for (x=0; xiX, y, iWidth, 1, (uint16_t*)usTemp ); 154 | } 155 | } /* GIFDraw() */ 156 | 157 | int gifPlay( char* gifPath ) 158 | { // 0=infinite 159 | gif.begin(BIG_ENDIAN_PIXELS); 160 | if( ! gif.open( gifPath, GIFOpenFile, GIFCloseFile, GIFReadFile, GIFSeekFile, GIFDraw ) ) { 161 | // log_n("Could not open gif %s", gifPath ); 162 | return maxLoopsDuration; 163 | } 164 | 165 | int frameDelay = 0; // store delay for the last frame 166 | int then = 0; // store overall delay 167 | bool showcomment = false; 168 | 169 | // center the GIF !! 170 | int w = gif.getCanvasWidth(); 171 | int h = gif.getCanvasHeight(); 172 | xOffset = ( tft.width() - w ) /2; 173 | yOffset = ( tft.height() - h ) /2; 174 | 175 | if( lastFile != currentFile ) { 176 | // log_n("Playing %s [%d,%d] with offset [%d,%d]", gifPath, w, h, xOffset, yOffset ); 177 | lastFile = currentFile; 178 | showcomment = true; 179 | } 180 | 181 | while (gif.playFrame(true, &frameDelay)) { 182 | if( showcomment ) 183 | if (gif.getComment(GifComment)) 184 | // log_n("GIF Comment: %s", GifComment); 185 | then += frameDelay; 186 | if( then > maxGifDuration ) { // avoid being trapped in infinite GIF's 187 | // log_w("Broke the GIF loop, max duration exceeded"); 188 | break; 189 | } 190 | } 191 | 192 | gif.close(); 193 | return then; 194 | } 195 | 196 | int getGifInventory( const char* basePath ) 197 | { 198 | int amount = 0; 199 | GifRootFolder = SD.open(basePath); 200 | if(!GifRootFolder){ 201 | // log_n("Failed to open directory"); 202 | return 0; 203 | } 204 | 205 | if(!GifRootFolder.isDirectory()){ 206 | // log_n("Not a directory"); 207 | return 0; 208 | } 209 | 210 | File file = GifRootFolder.openNextFile(); 211 | 212 | tft.setTextColor( TFT_WHITE, TFT_BLACK ); 213 | tft.setTextSize( 2 ); 214 | 215 | int textPosX = tft.width()/2 - 16; 216 | int textPosY = tft.height()/2 - 10; 217 | 218 | tft.drawString("GIF Files:", textPosX-40, textPosY-20 ); 219 | 220 | while( file ) { 221 | if(!file.isDirectory()) { 222 | GifFiles.push_back(std::string(file.name())); 223 | amount++; 224 | tft.drawString(String(amount), textPosX, textPosY ); 225 | file.close(); 226 | } 227 | file = GifRootFolder.openNextFile(); 228 | } 229 | GifRootFolder.close(); 230 | // log_n("Found %d GIF files", amount); 231 | return amount; 232 | } 233 | 234 | void setup() 235 | { 236 | // Serial.begin(115200); 237 | // while (!Serial) ; 238 | // pinMode(D6, OUTPUT); 239 | // digitalWrite(D6, HIGH); 240 | tft.begin(); 241 | tft.setRotation(2); 242 | 243 | int attempts = 0; 244 | int maxAttempts = 50; 245 | int delayBetweenAttempts = 300; 246 | bool isblinked = false; 247 | 248 | pinMode(D2, OUTPUT); 249 | while(! SD.begin(D2) ) { 250 | // log_n("SD Card mount failed! (attempt %d of %d)", attempts, maxAttempts ); 251 | isblinked = !isblinked; 252 | attempts++; 253 | if( isblinked ) { 254 | tft.setTextColor( TFT_WHITE, TFT_BLACK ); 255 | } else { 256 | tft.setTextColor( TFT_BLACK, TFT_WHITE ); 257 | } 258 | tft.drawString( "INSERT SD", tft.width()/2, tft.height()/2 ); 259 | 260 | if( attempts > maxAttempts ) { 261 | // log_n("Giving up"); 262 | } 263 | delay( delayBetweenAttempts ); 264 | } 265 | 266 | // log_n("SD Card mounted!"); 267 | // Serial.print("SD Card mounted!"); 268 | 269 | tft.begin(); 270 | tft.fillScreen(TFT_BLACK); 271 | 272 | totalFiles = getGifInventory( "/gif" ); // scan the SD card GIF folder 273 | 274 | } 275 | 276 | 277 | 278 | void loop() 279 | { 280 | tft.fillScreen(TFT_BLACK); 281 | 282 | const char * fileName = GifFiles[currentFile++%totalFiles].c_str(); 283 | const char * fileDir = "/gif/"; 284 | char * filePath = (char*)malloc(strlen(fileName)+strlen(fileDir)+1); 285 | strcpy(filePath, fileDir); 286 | strcat(filePath, fileName); 287 | 288 | int loops = maxLoopIterations; // max loops 289 | int durationControl = maxLoopsDuration; // force break loop after xxx ms 290 | 291 | while(loops-->0 && durationControl > 0 ) { 292 | durationControl -= gifPlay( (char*)filePath ); 293 | gif.reset(); 294 | } 295 | free(filePath); 296 | 297 | } 298 | 299 | -------------------------------------------------------------------------------- /examples/TP_firmware_update/chsc6x_ramcode.h: -------------------------------------------------------------------------------- 1 | #ifndef __CHSC6X_RAMCODE_H__ 2 | #define __CHSC6X_RAMCODE_H__ 3 | 4 | const unsigned char __attribute__((aligned(4))) fw_fcode_burn[1784] = { 5 | 0x08,0x80,0x6F,0x6D,0x00,0x00,0xF8,0x06,0x4B,0x4E,0x4C,0x54,0x80,0x01,0x88,0x00, 6 | 0x34,0x80,0xC0,0x46,0x00,0xA0,0x17,0x09,0x17,0x0A,0x08,0x50,0x04,0xB1,0x91,0x02, 7 | 0xFB,0xCB,0x0C,0x08,0xC0,0x6B,0x0D,0x08,0x85,0x06,0x0B,0x08,0xC0,0x6B,0x0C,0x08, 8 | 0x85,0x06,0x0C,0x09,0x40,0xA0,0x08,0x40,0x40,0xA0,0x48,0x40,0x0A,0x09,0x0B,0x0A, 9 | 0x0B,0x0B,0x08,0x58,0x10,0x50,0x04,0xB1,0x04,0xB2,0x9A,0x02,0xF9,0xCB,0x00,0x90, 10 | 0xF5,0x9A,0xC0,0x46,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0xF0,0x9D,0x80,0x00, 11 | 0xF0,0x9C,0x80,0x00,0x0C,0x06,0x80,0x00,0xF8,0x06,0x00,0x00,0x04,0x8D,0x80,0x00, 12 | 0x04,0x8D,0x80,0x00,0x04,0x8D,0x80,0x00,0x00,0xA0,0x80,0x00,0x30,0x00,0x00,0x00, 13 | 0x4D,0x03,0x00,0x00,0x31,0x00,0x00,0x00,0x15,0x03,0x00,0x00,0x33,0x00,0x00,0x00, 14 | 0xD9,0x04,0x00,0x00,0x32,0x00,0x00,0x00,0xD1,0x02,0x00,0x00,0x30,0x65,0x07,0x0C, 15 | 0x01,0xA3,0x23,0x40,0x05,0xF6,0x1C,0xA0,0x00,0x90,0x9E,0x98,0x00,0xA3,0x23,0x40, 16 | 0x03,0x0B,0x2D,0xFE,0x1D,0x40,0x00,0x90,0xC7,0x98,0x30,0x6D,0x0D,0x00,0x80,0x00, 17 | 0x0C,0x00,0x80,0x00,0xF0,0x65,0xFA,0xA0,0xC0,0xF0,0x00,0x90,0x8D,0x98,0x05,0xA0, 18 | 0xFF,0x97,0xE4,0x9F,0x0A,0x0C,0x0B,0x0D,0x00,0xA6,0x01,0xA7,0x05,0x80,0xC8,0xA0, 19 | 0x01,0xBC,0x00,0x90,0x81,0x98,0x00,0xAC,0x05,0xC0,0x2E,0x40,0x00,0x90,0xAC,0x98, 20 | 0x2B,0x48,0x1F,0x02,0xF3,0xC1,0x04,0x0B,0x01,0xA2,0x1A,0x40,0xF0,0x6D,0xC0,0x46, 21 | 0x80,0x96,0x98,0x00,0x0C,0x00,0x80,0x00,0x0D,0x00,0x80,0x00,0x30,0x65,0x07,0x0C, 22 | 0x03,0xFC,0x05,0xEC,0x23,0x40,0x00,0x90,0x97,0x98,0x2B,0xFA,0x23,0x40,0x00,0x90, 23 | 0x93,0x98,0x25,0x40,0x00,0x90,0x90,0x98,0x30,0x6D,0xC0,0x46,0x0C,0x00,0x80,0x00, 24 | 0x10,0x65,0x04,0xEC,0x06,0xA0,0xFF,0x97,0xB1,0x9F,0x20,0xA0,0xFF,0x97,0xAE,0x9F, 25 | 0x20,0xEC,0xFF,0x97,0xE3,0x9F,0x03,0x0B,0x01,0xA2,0x1A,0x40,0xFF,0x97,0xBA,0x9F, 26 | 0x10,0x6D,0xC0,0x46,0x0D,0x00,0x80,0x00,0xF0,0x65,0x04,0xEC,0x03,0xA0,0x0D,0xEC, 27 | 0x16,0xEC,0x0E,0x0F,0xFF,0x97,0x9A,0x9F,0x20,0xEC,0xFF,0x97,0xCF,0x9F,0x00,0xA3, 28 | 0x3B,0x40,0x00,0x90,0x69,0x98,0x0A,0x0B,0x0A,0xA2,0x1A,0x40,0x00,0x90,0x64,0x98, 29 | 0x00,0xAD,0x07,0xC0,0x00,0xA4,0x3B,0x48,0x33,0x15,0x01,0xB4,0x00,0x90,0x5C,0x98, 30 | 0xAC,0x02,0xF8,0xC1,0x02,0x0B,0x01,0xA2,0x1A,0x40,0xF0,0x6D,0x0C,0x00,0x80,0x00, 31 | 0x0D,0x00,0x80,0x00,0xF0,0x65,0x04,0xEC,0x06,0xA0,0x0D,0xEC,0x16,0xEC,0xFF,0x97, 32 | 0x75,0x9F,0x02,0xA0,0xFF,0x97,0x72,0x9F,0x20,0xEC,0xFF,0x97,0xA7,0x9F,0x00,0xAD, 33 | 0x08,0xC0,0x07,0x0F,0x00,0xA4,0x33,0x1D,0x01,0xB4,0x3B,0x40,0x00,0x90,0x3C,0x98, 34 | 0xA5,0x02,0xF8,0xC8,0x03,0x0B,0x01,0xA2,0x1A,0x40,0xFF,0x97,0x73,0x9F,0xF0,0x6D, 35 | 0x0C,0x00,0x80,0x00,0x0D,0x00,0x80,0x00,0x06,0x09,0x0B,0x58,0x81,0x60,0x00,0x33, 36 | 0x43,0xF0,0x18,0xE8,0xC0,0xF0,0x0A,0x58,0x00,0x3B,0xD3,0xEA,0x83,0x02,0xFA,0xC9, 37 | 0x01,0x60,0x70,0x07,0x30,0x06,0x80,0x00,0x10,0x65,0x94,0xE0,0x00,0xAC,0x05,0xCD, 38 | 0x00,0xA3,0x04,0xD9,0x01,0xB3,0x04,0xD0,0xA3,0x02,0xFA,0xC1,0x10,0x6D,0xC0,0x46, 39 | 0x10,0x65,0x09,0xF4,0x49,0xFC,0x03,0xEC,0x00,0xA0,0x00,0xA9,0x0B,0xC0,0x4C,0xEE, 40 | 0x24,0xF4,0xE4,0xFB,0x02,0xB4,0x00,0xA2,0x99,0x1A,0x40,0xE8,0x00,0xF4,0x02,0xB2, 41 | 0x00,0xFC,0xA2,0x02,0xF8,0xC1,0x10,0x6D,0x30,0x65,0x06,0x0D,0x2B,0x48,0xDA,0xF6, 42 | 0x06,0xC5,0x10,0xA4,0x1C,0xA0,0xFF,0x97,0xC7,0x9F,0x2B,0x48,0x1C,0x02,0xF9,0xC1, 43 | 0x30,0x6D,0xC0,0x46,0x0D,0x00,0x80,0x00,0x01,0x0B,0x01,0xA2,0x1A,0x40,0x70,0x07, 44 | 0x0D,0x00,0x80,0x00,0x01,0x0B,0x00,0xA2,0x1A,0x40,0x70,0x07,0x0D,0x00,0x80,0x00, 45 | 0x01,0x0B,0x18,0x40,0x70,0x07,0xC0,0x46,0x0C,0x00,0x80,0x00,0x01,0x0B,0x18,0x40, 46 | 0x70,0x07,0xC0,0x46,0x0D,0x00,0x80,0x00,0x01,0x0B,0x18,0x48,0x70,0x07,0xC0,0x46, 47 | 0x0C,0x00,0x80,0x00,0x10,0x65,0x03,0x0C,0x00,0xA3,0x23,0x40,0xFF,0x97,0xCC,0x9F, 48 | 0x20,0x48,0x10,0x6D,0x0C,0x00,0x80,0x00,0x10,0x65,0x04,0x0C,0x00,0xA3,0x23,0x40, 49 | 0xFF,0x97,0xC2,0x9F,0x23,0x48,0x01,0xA0,0x18,0x00,0x10,0x6D,0x0C,0x00,0x80,0x00, 50 | 0x30,0x65,0x80,0xA3,0xC2,0x28,0x5B,0xF1,0x9A,0x02,0x04,0xC0,0x0C,0x0B,0x1B,0x58, 51 | 0x05,0xA2,0x5A,0x40,0x30,0x6D,0x84,0x28,0x45,0x28,0x00,0xAC,0x0B,0xC0,0x2D,0xF3, 52 | 0x28,0xEC,0x01,0xBC,0xFF,0x97,0x1C,0x9F,0x24,0xF4,0x80,0xA3,0x5B,0xF1,0x24,0xFC, 53 | 0xED,0xE8,0x00,0xAC,0xF4,0xC1,0x02,0x0B,0x1B,0x58,0x00,0xA2,0x5A,0x40,0xE9,0x87, 54 | 0x04,0x8D,0x80,0x00,0x30,0x65,0xC2,0x28,0x84,0x28,0x43,0x28,0x09,0x0D,0x12,0xF4, 55 | 0x10,0xEC,0x18,0x03,0x2A,0xEC,0x21,0xEC,0xFF,0x97,0x16,0x9F,0x28,0xEC,0x21,0xEC, 56 | 0x00,0x90,0xC4,0x99,0x04,0x0B,0x1B,0x58,0x00,0xA2,0x58,0x20,0x00,0xFC,0x98,0x20, 57 | 0x5A,0x40,0x30,0x6D,0x00,0x90,0x80,0x00,0x04,0x8D,0x80,0x00,0xF0,0x65,0x5F,0x06, 58 | 0x56,0x06,0x4D,0x06,0x44,0x06,0xF0,0x64,0x83,0x28,0x42,0x28,0x04,0xEC,0x19,0xEC, 59 | 0x38,0x08,0x92,0x06,0x99,0x06,0x00,0x90,0xA9,0x99,0xA3,0x29,0xE2,0x28,0x1B,0xF4, 60 | 0x9B,0xE8,0x83,0x02,0x09,0xC0,0x34,0x0B,0x1B,0x58,0x03,0xA2,0x5A,0x40,0x3C,0x6C, 61 | 0x90,0x06,0x99,0x06,0xA2,0x06,0xAB,0x06,0xF0,0x6D,0x54,0x06,0x23,0xF5,0x00,0xAB, 62 | 0x4E,0xC0,0x00,0xA2,0x91,0x05,0x4F,0xC0,0x80,0xA3,0x5C,0xF0,0x4D,0x06,0x00,0xA7, 63 | 0xA3,0x06,0x2C,0xEC,0x5D,0x05,0x01,0xC9,0x80,0xA4,0x64,0xF0,0x25,0x0B,0xB8,0x06, 64 | 0xFE,0xE8,0xD0,0x04,0x40,0x06,0x21,0xEC,0x32,0xEC,0xFF,0x97,0xF3,0x9E,0x2D,0xEB, 65 | 0x40,0x06,0x21,0xEC,0x32,0xEC,0xFF,0x97,0xED,0x9E,0x3F,0xE9,0x00,0xAD,0xE8,0xC1, 66 | 0x80,0xA7,0x4D,0x06,0x00,0xA6,0x7F,0xF0,0x2C,0xEC,0xBD,0x02,0x01,0xC9,0x80,0xA4, 67 | 0x64,0xF0,0x1A,0x0B,0x30,0xEC,0xF2,0xE8,0x50,0x04,0x21,0xEC,0x2D,0xEB,0xFF,0x97, 68 | 0xB3,0x9E,0x36,0xE9,0x00,0xAD,0xEF,0xC1,0x13,0x0B,0x18,0x58,0x11,0x0B,0x45,0x40, 69 | 0x1A,0x48,0x12,0x0B,0x1B,0x48,0x9A,0x02,0x0F,0xC1,0x00,0xA3,0x07,0x80,0x0D,0x0C, 70 | 0x19,0xE9,0x0E,0x0C,0x1A,0xE9,0x09,0x48,0x12,0x48,0x91,0x02,0x05,0xC1,0x01,0xB3, 71 | 0x99,0x05,0xF4,0xC8,0x00,0xA3,0x43,0x20,0xA9,0x87,0x09,0xA3,0x43,0x40,0xA6,0x87, 72 | 0x50,0x06,0xFF,0x97,0x7D,0x9E,0xAC,0x87,0x03,0x0B,0x18,0x58,0x4A,0x06,0x42,0x40, 73 | 0xF0,0x87,0xC0,0x46,0x00,0x90,0x80,0x00,0x04,0x8D,0x80,0x00,0x80,0x94,0x80,0x00, 74 | 0xF0,0x65,0x57,0x06,0x46,0x06,0xC0,0x64,0x80,0xA3,0x07,0xF4,0x00,0xA4,0xDB,0xF0, 75 | 0x3F,0xFC,0x00,0xA5,0xA0,0x06,0x9A,0x06,0x3E,0xEC,0x57,0x05,0x01,0xC9,0x80,0xA6, 76 | 0xF6,0xF0,0x36,0xF4,0x36,0xFC,0x40,0x06,0x31,0xEC,0x15,0x0A,0xFF,0x97,0x6C,0x9E, 77 | 0x00,0xAE,0x19,0xC0,0x70,0xEE,0x13,0x0B,0x00,0xF4,0x00,0xFC,0xC0,0xE8,0x42,0x06, 78 | 0x01,0xBB,0x19,0x48,0x64,0xE8,0x51,0x03,0x01,0xB2,0x6D,0xE8,0x24,0xF4,0x2D,0xF4, 79 | 0x12,0xF4,0x01,0xB3,0x24,0xFC,0x2D,0xFC,0x12,0xFC,0x83,0x02,0xF1,0xC1,0x33,0xEC, 80 | 0x43,0x04,0x1B,0xF4,0x1B,0xFC,0x98,0x06,0xBF,0xEB,0x3F,0xF4,0x3F,0xFC,0x00,0xAF, 81 | 0xD2,0xC1,0x28,0xF4,0x20,0x03,0x0C,0x6C,0x90,0x06,0x9A,0x06,0xF0,0x6D,0xC0,0x46, 82 | 0x00,0x90,0x80,0x00,0x01,0x90,0x80,0x00,0xF0,0x65,0x19,0x0C,0x00,0xA0,0x08,0xA1, 83 | 0x22,0xEC,0xFF,0x97,0x39,0x9E,0x23,0x58,0x01,0xB3,0x1F,0xC0,0x15,0x0B,0x1C,0x28, 84 | 0x80,0xA3,0x1B,0xF2,0xA3,0x02,0x00,0xC2,0xF0,0x6D,0x13,0x0B,0x1E,0x28,0x13,0x0B, 85 | 0xF6,0xE8,0x73,0xEE,0x9E,0x01,0x00,0xAE,0xF6,0xC1,0x20,0xEC,0xFF,0x97,0xA0,0x9F, 86 | 0x0B,0x0D,0x07,0xEC,0x08,0xA1,0x20,0xEC,0x2A,0xEC,0xFF,0x97,0x1D,0x9E,0x2B,0x58, 87 | 0xBB,0x02,0xE9,0xC1,0x0A,0x0B,0x1B,0x58,0x5E,0x40,0xE5,0x87,0x09,0x0B,0x1B,0x58, 88 | 0x01,0xB3,0xDB,0xC1,0x06,0x0B,0x1B,0x58,0x08,0xA2,0x5A,0x40,0xDC,0x87,0xC0,0x46, 89 | 0x00,0x90,0x80,0x00,0x06,0x90,0x80,0x00,0x02,0x90,0x80,0x00,0xCA,0xCA,0xFF,0xFF, 90 | 0x04,0x8D,0x80,0x00,0x04,0x90,0x80,0x00,0x70,0x65,0x22,0x0D,0x2B,0x58,0x0F,0xA2, 91 | 0x1A,0x40,0x09,0xA2,0x5A,0x40,0x0C,0xA1,0x04,0xEC,0xFF,0x97,0x59,0x9E,0x23,0x48, 92 | 0x00,0xA8,0x13,0xC1,0x62,0x48,0xD2,0xE8,0xFF,0xAA,0x0F,0xC1,0x1A,0x0A,0x11,0x48, 93 | 0x99,0x02,0x2B,0xC0,0x11,0x4A,0x99,0x02,0x2A,0xC0,0x11,0x4C,0x99,0x02,0x11,0xC0, 94 | 0x11,0x4E,0x03,0xA0,0x99,0x02,0x0E,0xC0,0x28,0x58,0x03,0x80,0x28,0x58,0x03,0xA3, 95 | 0x43,0x40,0x23,0x48,0x03,0x40,0x06,0xA1,0xFF,0x97,0x3A,0x9E,0x2B,0x58,0x40,0x02, 96 | 0xD8,0x20,0x70,0x6D,0x02,0xA0,0x0D,0x09,0x00,0xA3,0x0B,0x40,0x80,0xB1,0x0B,0x40, 97 | 0x0B,0x0E,0xC3,0xF0,0x05,0xA1,0xD2,0xE8,0x53,0x58,0x20,0xEC,0x31,0x40,0x00,0x90, 98 | 0x73,0x98,0x01,0xA3,0x33,0x40,0x28,0x58,0x23,0x48,0xE3,0x87,0x00,0xA0,0xEA,0x87, 99 | 0x01,0xA0,0xE8,0x87,0x04,0x8D,0x80,0x00,0x7C,0x00,0x00,0x00,0x00,0x9E,0x80,0x00, 100 | 0x03,0x00,0x80,0x00,0x30,0x65,0x0D,0x0C,0x63,0x4A,0x35,0xAB,0x00,0xC0,0x30,0x6D, 101 | 0xFA,0xA0,0x80,0xF0,0xFF,0x97,0xF0,0x9D,0x09,0x0D,0x21,0xEC,0x10,0xA2,0x28,0xEC, 102 | 0xFF,0x97,0xFA,0x9D,0x28,0xEC,0xFF,0x97,0x9F,0x9F,0x06,0x08,0x06,0x09,0x10,0xA2, 103 | 0xFF,0x97,0xF2,0x9D,0x30,0xA3,0x63,0x42,0xE9,0x87,0xC0,0x46,0x00,0x9F,0x80,0x00, 104 | 0x80,0x9F,0x80,0x00,0x40,0x9F,0x80,0x00,0xC0,0x9F,0x80,0x00,0x00,0x65,0x13,0x0B, 105 | 0x13,0x0A,0x19,0x58,0x0A,0x00,0x1A,0x50,0x12,0x0B,0x55,0xA2,0x1A,0x40,0x12,0x0A, 106 | 0x12,0x0B,0x1A,0x20,0x12,0x0A,0x13,0x0B,0x1A,0x50,0x13,0x0A,0xFF,0xA3,0x1B,0xF6, 107 | 0x13,0x50,0x01,0xA3,0x5B,0x02,0x04,0xB2,0x13,0x20,0x10,0x0B,0x00,0xA2,0x10,0x09, 108 | 0x1A,0x40,0x01,0xA3,0x0B,0x40,0x10,0xB1,0x0A,0x50,0x0E,0x0A,0x13,0x40,0x80,0xA3, 109 | 0x1B,0xF4,0x1F,0xA2,0x1A,0x40,0xFF,0x97,0xB5,0x9F,0xFC,0x87,0x40,0x06,0x80,0x00, 110 | 0xFF,0xFF,0xFF,0xFE,0x10,0x04,0x80,0x00,0x00,0x9E,0xFF,0xFF,0x28,0x00,0x80,0x00, 111 | 0xC0,0x9F,0x80,0x00,0x04,0x8D,0x80,0x00,0x60,0x00,0x80,0x00,0x68,0x00,0x80,0x00, 112 | 0x20,0x06,0x80,0x00,0x03,0x00,0x80,0x00,0x18,0x07,0xC0,0x46,0x30,0x65,0x0D,0xF4, 113 | 0x2D,0xFC,0x03,0xEC,0x00,0xA0,0x00,0xAD,0x14,0xC0,0x19,0x48,0x00,0xA4,0x01,0xB3, 114 | 0x00,0xA2,0x01,0x80,0x19,0x48,0x01,0xB3,0x08,0xE8,0x51,0x03,0x01,0xB2,0x64,0xE8, 115 | 0x12,0xF4,0x00,0xF4,0x24,0xF4,0x12,0xFC,0x00,0xFC,0x24,0xFC,0x95,0x02,0xF1,0xC8, 116 | 0x24,0xF4,0x20,0x03,0x30,0x6D,0xC0,0x46 117 | }; 118 | 119 | #endif 120 | -------------------------------------------------------------------------------- /lv_conf.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @file lv_conf.h 3 | * Configuration file for v8.3.5 4 | */ 5 | 6 | /* 7 | * Copy this file as `lv_conf.h` 8 | * 1. simply next to the `lvgl` folder 9 | * 2. or any other places and 10 | * - define `LV_CONF_INCLUDE_SIMPLE` 11 | * - add the path as include path 12 | */ 13 | 14 | /* clang-format off */ 15 | #if 1 /*Set it to "1" to enable content*/ 16 | 17 | #ifndef LV_CONF_H 18 | #define LV_CONF_H 19 | 20 | /*==================== 21 | COLOR SETTINGS 22 | *====================*/ 23 | 24 | /*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ 25 | #define LV_COLOR_DEPTH 16 26 | 27 | /*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/ 28 | #define LV_COLOR_16_SWAP 0 29 | 30 | /*Enable features to draw on transparent background. 31 | *It's required if opa, and transform_* style properties are used. 32 | *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/ 33 | #define LV_COLOR_SCREEN_TRANSP 0 34 | 35 | /* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. 36 | * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ 37 | #define LV_COLOR_MIX_ROUND_OFS 0 38 | 39 | /*Images pixels with this color will not be drawn if they are chroma keyed)*/ 40 | #define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/ 41 | 42 | /*========================= 43 | MEMORY SETTINGS 44 | *=========================*/ 45 | 46 | /*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/ 47 | #define LV_MEM_CUSTOM 0 48 | #if LV_MEM_CUSTOM == 0 49 | /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/ 50 | #define LV_MEM_SIZE (48U * 1024U) /*[bytes]*/ 51 | 52 | /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ 53 | #define LV_MEM_ADR 0 /*0: unused*/ 54 | /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ 55 | #if LV_MEM_ADR == 0 56 | #undef LV_MEM_POOL_INCLUDE 57 | #undef LV_MEM_POOL_ALLOC 58 | #endif 59 | 60 | #else /*LV_MEM_CUSTOM*/ 61 | #define LV_MEM_CUSTOM_INCLUDE /*Header for the dynamic memory function*/ 62 | #define LV_MEM_CUSTOM_ALLOC malloc 63 | #define LV_MEM_CUSTOM_FREE free 64 | #define LV_MEM_CUSTOM_REALLOC realloc 65 | #endif /*LV_MEM_CUSTOM*/ 66 | 67 | /*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms. 68 | *You will see an error log message if there wasn't enough buffers. */ 69 | #define LV_MEM_BUF_MAX_NUM 16 70 | 71 | /*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/ 72 | #define LV_MEMCPY_MEMSET_STD 0 73 | 74 | /*==================== 75 | HAL SETTINGS 76 | *====================*/ 77 | 78 | /*Default display refresh period. LVG will redraw changed areas with this period time*/ 79 | #define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ 80 | 81 | /*Input device read period in milliseconds*/ 82 | #define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ 83 | 84 | /*Use a custom tick source that tells the elapsed time in milliseconds. 85 | *It removes the need to manually update the tick with `lv_tick_inc()`)*/ 86 | #define LV_TICK_CUSTOM 1 87 | #if LV_TICK_CUSTOM 88 | #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ 89 | #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ 90 | /*If using lvgl as ESP32 component*/ 91 | // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" 92 | // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) 93 | #endif /*LV_TICK_CUSTOM*/ 94 | 95 | /*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. 96 | *(Not so important, you can adjust it to modify default sizes and spaces)*/ 97 | #define LV_DPI_DEF 130 /*[px/inch]*/ 98 | 99 | /*======================= 100 | * FEATURE CONFIGURATION 101 | *=======================*/ 102 | 103 | /*------------- 104 | * Drawing 105 | *-----------*/ 106 | 107 | /*Enable complex draw engine. 108 | *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/ 109 | #define LV_DRAW_COMPLEX 1 110 | #if LV_DRAW_COMPLEX != 0 111 | 112 | /*Allow buffering some shadow calculation. 113 | *LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` 114 | *Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/ 115 | #define LV_SHADOW_CACHE_SIZE 0 116 | 117 | /* Set number of maximally cached circle data. 118 | * The circumference of 1/4 circle are saved for anti-aliasing 119 | * radius * 4 bytes are used per circle (the most often used radiuses are saved) 120 | * 0: to disable caching */ 121 | #define LV_CIRCLE_CACHE_SIZE 4 122 | #endif /*LV_DRAW_COMPLEX*/ 123 | 124 | /** 125 | * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer 126 | * and blend it as an image with the given opacity. 127 | * Note that `bg_opa`, `text_opa` etc don't require buffering into layer) 128 | * The widget can be buffered in smaller chunks to avoid using large buffers. 129 | * 130 | * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it 131 | * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated. 132 | * 133 | * Both buffer sizes are in bytes. 134 | * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers 135 | * and can't be drawn in chunks. So these settings affects only widgets with opacity. 136 | */ 137 | #define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024) 138 | #define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024) 139 | 140 | /*Default image cache size. Image caching keeps the images opened. 141 | *If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added) 142 | *With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images. 143 | *However the opened images might consume additional RAM. 144 | *0: to disable caching*/ 145 | #define LV_IMG_CACHE_DEF_SIZE 0 146 | 147 | /*Number of stops allowed per gradient. Increase this to allow more stops. 148 | *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ 149 | #define LV_GRADIENT_MAX_STOPS 2 150 | 151 | /*Default gradient buffer size. 152 | *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again. 153 | *LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes. 154 | *If the cache is too small the map will be allocated only while it's required for the drawing. 155 | *0 mean no caching.*/ 156 | #define LV_GRAD_CACHE_DEF_SIZE 0 157 | 158 | /*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display) 159 | *LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface 160 | *The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */ 161 | #define LV_DITHER_GRADIENT 0 162 | #if LV_DITHER_GRADIENT 163 | /*Add support for error diffusion dithering. 164 | *Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing. 165 | *The increase in memory consumption is (24 bits * object's width)*/ 166 | #define LV_DITHER_ERROR_DIFFUSION 0 167 | #endif 168 | 169 | /*Maximum buffer size to allocate for rotation. 170 | *Only used if software rotation is enabled in the display driver.*/ 171 | #define LV_DISP_ROT_MAX_BUF (10*1024) 172 | 173 | /*------------- 174 | * GPU 175 | *-----------*/ 176 | 177 | /*Use Arm's 2D acceleration library Arm-2D */ 178 | #define LV_USE_GPU_ARM2D 0 179 | 180 | /*Use STM32's DMA2D (aka Chrom Art) GPU*/ 181 | #define LV_USE_GPU_STM32_DMA2D 0 182 | #if LV_USE_GPU_STM32_DMA2D 183 | /*Must be defined to include path of CMSIS header of target processor 184 | e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ 185 | #define LV_GPU_DMA2D_CMSIS_INCLUDE 186 | #endif 187 | 188 | /*Use SWM341's DMA2D GPU*/ 189 | #define LV_USE_GPU_SWM341_DMA2D 0 190 | #if LV_USE_GPU_SWM341_DMA2D 191 | #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h" 192 | #endif 193 | 194 | /*Use NXP's PXP GPU iMX RTxxx platforms*/ 195 | #define LV_USE_GPU_NXP_PXP 0 196 | #if LV_USE_GPU_NXP_PXP 197 | /*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c) 198 | * and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS 199 | * has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected. 200 | *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init() 201 | */ 202 | #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0 203 | #endif 204 | 205 | /*Use NXP's VG-Lite GPU iMX RTxxx platforms*/ 206 | #define LV_USE_GPU_NXP_VG_LITE 0 207 | 208 | /*Use SDL renderer API*/ 209 | #define LV_USE_GPU_SDL 0 210 | #if LV_USE_GPU_SDL 211 | #define LV_GPU_SDL_INCLUDE_PATH 212 | /*Texture cache size, 8MB by default*/ 213 | #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8) 214 | /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/ 215 | #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) 216 | #endif 217 | 218 | /*------------- 219 | * Logging 220 | *-----------*/ 221 | 222 | /*Enable the log module*/ 223 | #define LV_USE_LOG 0 224 | #if LV_USE_LOG 225 | 226 | /*How important log should be added: 227 | *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information 228 | *LV_LOG_LEVEL_INFO Log important events 229 | *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem 230 | *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail 231 | *LV_LOG_LEVEL_USER Only logs added by the user 232 | *LV_LOG_LEVEL_NONE Do not log anything*/ 233 | #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN 234 | 235 | /*1: Print the log with 'printf'; 236 | *0: User need to register a callback with `lv_log_register_print_cb()`*/ 237 | #define LV_LOG_PRINTF 0 238 | 239 | /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ 240 | #define LV_LOG_TRACE_MEM 1 241 | #define LV_LOG_TRACE_TIMER 1 242 | #define LV_LOG_TRACE_INDEV 1 243 | #define LV_LOG_TRACE_DISP_REFR 1 244 | #define LV_LOG_TRACE_EVENT 1 245 | #define LV_LOG_TRACE_OBJ_CREATE 1 246 | #define LV_LOG_TRACE_LAYOUT 1 247 | #define LV_LOG_TRACE_ANIM 1 248 | 249 | #endif /*LV_USE_LOG*/ 250 | 251 | /*------------- 252 | * Asserts 253 | *-----------*/ 254 | 255 | /*Enable asserts if an operation is failed or an invalid data is found. 256 | *If LV_USE_LOG is enabled an error message will be printed on failure*/ 257 | #define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ 258 | #define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ 259 | #define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ 260 | #define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ 261 | #define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ 262 | 263 | /*Add a custom handler when assert happens e.g. to restart the MCU*/ 264 | #define LV_ASSERT_HANDLER_INCLUDE 265 | #define LV_ASSERT_HANDLER while(1); /*Halt by default*/ 266 | 267 | /*------------- 268 | * Others 269 | *-----------*/ 270 | 271 | /*1: Show CPU usage and FPS count*/ 272 | #define LV_USE_PERF_MONITOR 0 273 | #if LV_USE_PERF_MONITOR 274 | #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT 275 | #endif 276 | 277 | /*1: Show the used memory and the memory fragmentation 278 | * Requires LV_MEM_CUSTOM = 0*/ 279 | #define LV_USE_MEM_MONITOR 0 280 | #if LV_USE_MEM_MONITOR 281 | #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT 282 | #endif 283 | 284 | /*1: Draw random colored rectangles over the redrawn areas*/ 285 | #define LV_USE_REFR_DEBUG 0 286 | 287 | /*Change the built in (v)snprintf functions*/ 288 | #define LV_SPRINTF_CUSTOM 0 289 | #if LV_SPRINTF_CUSTOM 290 | #define LV_SPRINTF_INCLUDE 291 | #define lv_snprintf snprintf 292 | #define lv_vsnprintf vsnprintf 293 | #else /*LV_SPRINTF_CUSTOM*/ 294 | #define LV_SPRINTF_USE_FLOAT 0 295 | #endif /*LV_SPRINTF_CUSTOM*/ 296 | 297 | #define LV_USE_USER_DATA 1 298 | 299 | /*Garbage Collector settings 300 | *Used if lvgl is bound to higher level language and the memory is managed by that language*/ 301 | #define LV_ENABLE_GC 0 302 | #if LV_ENABLE_GC != 0 303 | #define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/ 304 | #endif /*LV_ENABLE_GC*/ 305 | 306 | /*===================== 307 | * COMPILER SETTINGS 308 | *====================*/ 309 | 310 | /*For big endian systems set to 1*/ 311 | #define LV_BIG_ENDIAN_SYSTEM 0 312 | 313 | /*Define a custom attribute to `lv_tick_inc` function*/ 314 | #define LV_ATTRIBUTE_TICK_INC 315 | 316 | /*Define a custom attribute to `lv_timer_handler` function*/ 317 | #define LV_ATTRIBUTE_TIMER_HANDLER 318 | 319 | /*Define a custom attribute to `lv_disp_flush_ready` function*/ 320 | #define LV_ATTRIBUTE_FLUSH_READY 321 | 322 | /*Required alignment size for buffers*/ 323 | #define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 324 | 325 | /*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). 326 | * E.g. __attribute__((aligned(4)))*/ 327 | #define LV_ATTRIBUTE_MEM_ALIGN 328 | 329 | /*Attribute to mark large constant arrays for example font's bitmaps*/ 330 | #define LV_ATTRIBUTE_LARGE_CONST 331 | 332 | /*Compiler prefix for a big array declaration in RAM*/ 333 | #define LV_ATTRIBUTE_LARGE_RAM_ARRAY 334 | 335 | /*Place performance critical functions into a faster memory (e.g RAM)*/ 336 | #define LV_ATTRIBUTE_FAST_MEM 337 | 338 | /*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/ 339 | #define LV_ATTRIBUTE_DMA 340 | 341 | /*Export integer constant to binding. This macro is used with constants in the form of LV_ that 342 | *should also appear on LVGL binding API such as Micropython.*/ 343 | #define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ 344 | 345 | /*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/ 346 | #define LV_USE_LARGE_COORD 0 347 | 348 | /*================== 349 | * FONT USAGE 350 | *===================*/ 351 | 352 | /*Montserrat fonts with ASCII range and some symbols using bpp = 4 353 | *https://fonts.google.com/specimen/Montserrat*/ 354 | // #define LV_FONT_MONTSERRAT_8 1 355 | // #define LV_FONT_MONTSERRAT_10 1 356 | // #define LV_FONT_MONTSERRAT_12 1 357 | // #define LV_FONT_MONTSERRAT_14 1 358 | // #define LV_FONT_MONTSERRAT_16 1 359 | // #define LV_FONT_MONTSERRAT_18 1 360 | #define LV_FONT_MONTSERRAT_8 0 361 | #define LV_FONT_MONTSERRAT_10 0 362 | #define LV_FONT_MONTSERRAT_12 0 363 | #define LV_FONT_MONTSERRAT_14 1 364 | #define LV_FONT_MONTSERRAT_16 0 365 | #define LV_FONT_MONTSERRAT_18 0 366 | #define LV_FONT_MONTSERRAT_20 0 367 | #define LV_FONT_MONTSERRAT_22 0 368 | #define LV_FONT_MONTSERRAT_24 0 369 | #define LV_FONT_MONTSERRAT_26 0 370 | #define LV_FONT_MONTSERRAT_28 0 371 | #define LV_FONT_MONTSERRAT_30 0 372 | #define LV_FONT_MONTSERRAT_32 0 373 | #define LV_FONT_MONTSERRAT_34 0 374 | #define LV_FONT_MONTSERRAT_36 0 375 | #define LV_FONT_MONTSERRAT_38 0 376 | #define LV_FONT_MONTSERRAT_40 0 377 | #define LV_FONT_MONTSERRAT_42 0 378 | #define LV_FONT_MONTSERRAT_44 0 379 | #define LV_FONT_MONTSERRAT_46 0 380 | #define LV_FONT_MONTSERRAT_48 0 381 | 382 | /*Demonstrate special features*/ 383 | #define LV_FONT_MONTSERRAT_12_SUBPX 0 384 | #define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ 385 | #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ 386 | #define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ 387 | 388 | /*Pixel perfect monospace fonts*/ 389 | #define LV_FONT_UNSCII_8 0 390 | #define LV_FONT_UNSCII_16 0 391 | 392 | /*Optionally declare custom fonts here. 393 | *You can use these fonts as default font too and they will be available globally. 394 | *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ 395 | #define LV_FONT_CUSTOM_DECLARE 396 | 397 | /*Always set a default font*/ 398 | #define LV_FONT_DEFAULT &lv_font_montserrat_14 399 | 400 | /*Enable handling large font and/or fonts with a lot of characters. 401 | *The limit depends on the font size, font face and bpp. 402 | *Compiler error will be triggered if a font needs it.*/ 403 | #define LV_FONT_FMT_TXT_LARGE 0 404 | 405 | /*Enables/disables support for compressed fonts.*/ 406 | #define LV_USE_FONT_COMPRESSED 0 407 | 408 | /*Enable subpixel rendering*/ 409 | #define LV_USE_FONT_SUBPX 0 410 | #if LV_USE_FONT_SUBPX 411 | /*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/ 412 | #define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/ 413 | #endif 414 | 415 | /*Enable drawing placeholders when glyph dsc is not found*/ 416 | #define LV_USE_FONT_PLACEHOLDER 1 417 | 418 | /*================= 419 | * TEXT SETTINGS 420 | *=================*/ 421 | 422 | /** 423 | * Select a character encoding for strings. 424 | * Your IDE or editor should have the same character encoding 425 | * - LV_TXT_ENC_UTF8 426 | * - LV_TXT_ENC_ASCII 427 | */ 428 | #define LV_TXT_ENC LV_TXT_ENC_UTF8 429 | 430 | /*Can break (wrap) texts on these chars*/ 431 | #define LV_TXT_BREAK_CHARS " ,.;:-_" 432 | 433 | /*If a word is at least this long, will break wherever "prettiest" 434 | *To disable, set to a value <= 0*/ 435 | #define LV_TXT_LINE_BREAK_LONG_LEN 0 436 | 437 | /*Minimum number of characters in a long word to put on a line before a break. 438 | *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ 439 | #define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 440 | 441 | /*Minimum number of characters in a long word to put on a line after a break. 442 | *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ 443 | #define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 444 | 445 | /*The control character to use for signalling text recoloring.*/ 446 | #define LV_TXT_COLOR_CMD "#" 447 | 448 | /*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. 449 | *The direction will be processed according to the Unicode Bidirectional Algorithm: 450 | *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ 451 | #define LV_USE_BIDI 0 452 | #if LV_USE_BIDI 453 | /*Set the default direction. Supported values: 454 | *`LV_BASE_DIR_LTR` Left-to-Right 455 | *`LV_BASE_DIR_RTL` Right-to-Left 456 | *`LV_BASE_DIR_AUTO` detect texts base direction*/ 457 | #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO 458 | #endif 459 | 460 | /*Enable Arabic/Persian processing 461 | *In these languages characters should be replaced with an other form based on their position in the text*/ 462 | #define LV_USE_ARABIC_PERSIAN_CHARS 0 463 | 464 | /*================== 465 | * WIDGET USAGE 466 | *================*/ 467 | 468 | /*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ 469 | 470 | #define LV_USE_ARC 1 471 | 472 | #define LV_USE_BAR 1 473 | 474 | #define LV_USE_BTN 1 475 | 476 | #define LV_USE_BTNMATRIX 1 477 | 478 | #define LV_USE_CANVAS 1 479 | 480 | #define LV_USE_CHECKBOX 1 481 | 482 | #define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ 483 | 484 | #define LV_USE_IMG 1 /*Requires: lv_label*/ 485 | 486 | #define LV_USE_LABEL 1 487 | #if LV_USE_LABEL 488 | #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ 489 | #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ 490 | #endif 491 | 492 | #define LV_USE_LINE 1 493 | 494 | #define LV_USE_ROLLER 1 /*Requires: lv_label*/ 495 | #if LV_USE_ROLLER 496 | #define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/ 497 | #endif 498 | 499 | #define LV_USE_SLIDER 1 /*Requires: lv_bar*/ 500 | 501 | #define LV_USE_SWITCH 1 502 | 503 | #define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ 504 | #if LV_USE_TEXTAREA != 0 505 | #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ 506 | #endif 507 | 508 | #define LV_USE_TABLE 1 509 | 510 | /*================== 511 | * EXTRA COMPONENTS 512 | *==================*/ 513 | 514 | /*----------- 515 | * Widgets 516 | *----------*/ 517 | #define LV_USE_ANIMIMG 1 518 | 519 | // #define LV_USE_CALENDAR 1 520 | #define LV_USE_CALENDAR 1 521 | #if LV_USE_CALENDAR 522 | #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 523 | #if LV_CALENDAR_WEEK_STARTS_MONDAY 524 | #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} 525 | #else 526 | #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} 527 | #endif 528 | 529 | #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} 530 | #define LV_USE_CALENDAR_HEADER_ARROW 1 531 | #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 532 | #endif /*LV_USE_CALENDAR*/ 533 | 534 | #define LV_USE_CHART 1 535 | 536 | #define LV_USE_COLORWHEEL 1 537 | 538 | #define LV_USE_IMGBTN 1 539 | 540 | #define LV_USE_KEYBOARD 1 541 | 542 | #define LV_USE_LED 1 543 | 544 | #define LV_USE_LIST 1 545 | 546 | #define LV_USE_MENU 1 547 | 548 | #define LV_USE_METER 1 549 | 550 | #define LV_USE_MSGBOX 1 551 | 552 | #define LV_USE_SPAN 1 553 | #if LV_USE_SPAN 554 | /*A line text can contain maximum num of span descriptor */ 555 | #define LV_SPAN_SNIPPET_STACK_SIZE 64 556 | #endif 557 | 558 | #define LV_USE_SPINBOX 1 559 | 560 | #define LV_USE_SPINNER 1 561 | 562 | #define LV_USE_TABVIEW 1 563 | 564 | #define LV_USE_TILEVIEW 1 565 | 566 | #define LV_USE_WIN 1 567 | 568 | /*----------- 569 | * Themes 570 | *----------*/ 571 | 572 | /*A simple, impressive and very complete theme*/ 573 | #define LV_USE_THEME_DEFAULT 1 574 | #if LV_USE_THEME_DEFAULT 575 | 576 | /*0: Light mode; 1: Dark mode*/ 577 | #define LV_THEME_DEFAULT_DARK 0 578 | 579 | /*1: Enable grow on press*/ 580 | #define LV_THEME_DEFAULT_GROW 1 581 | 582 | /*Default transition time in [ms]*/ 583 | #define LV_THEME_DEFAULT_TRANSITION_TIME 80 584 | #endif /*LV_USE_THEME_DEFAULT*/ 585 | 586 | /*A very simple theme that is a good starting point for a custom theme*/ 587 | #define LV_USE_THEME_BASIC 1 588 | 589 | /*A theme designed for monochrome displays*/ 590 | // #define LV_USE_THEME_MONO 1 591 | #define LV_USE_THEME_MONO 0 592 | 593 | /*----------- 594 | * Layouts 595 | *----------*/ 596 | 597 | /*A layout similar to Flexbox in CSS.*/ 598 | #define LV_USE_FLEX 1 599 | 600 | /*A layout similar to Grid in CSS.*/ 601 | #define LV_USE_GRID 1 602 | 603 | /*--------------------- 604 | * 3rd party libraries 605 | *--------------------*/ 606 | 607 | /*File system interfaces for common APIs */ 608 | 609 | /*API for fopen, fread, etc*/ 610 | #define LV_USE_FS_STDIO 0 611 | #if LV_USE_FS_STDIO 612 | #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ 613 | #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ 614 | #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ 615 | #endif 616 | 617 | /*API for open, read, etc*/ 618 | #define LV_USE_FS_POSIX 0 619 | #if LV_USE_FS_POSIX 620 | #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ 621 | #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ 622 | #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ 623 | #endif 624 | 625 | /*API for CreateFile, ReadFile, etc*/ 626 | #define LV_USE_FS_WIN32 0 627 | #if LV_USE_FS_WIN32 628 | #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ 629 | #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ 630 | #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ 631 | #endif 632 | 633 | /*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ 634 | #define LV_USE_FS_FATFS 0 635 | #if LV_USE_FS_FATFS 636 | #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ 637 | #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ 638 | #endif 639 | 640 | /*PNG decoder library*/ 641 | #define LV_USE_PNG 0 642 | 643 | /*BMP decoder library*/ 644 | #define LV_USE_BMP 0 645 | 646 | /* JPG + split JPG decoder library. 647 | * Split JPG is a custom format optimized for embedded systems. */ 648 | #define LV_USE_SJPG 0 649 | 650 | /*GIF decoder library*/ 651 | #define LV_USE_GIF 0 652 | 653 | /*QR code library*/ 654 | #define LV_USE_QRCODE 0 655 | 656 | /*FreeType library*/ 657 | #define LV_USE_FREETYPE 0 658 | #if LV_USE_FREETYPE 659 | /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/ 660 | #define LV_FREETYPE_CACHE_SIZE (16 * 1024) 661 | #if LV_FREETYPE_CACHE_SIZE >= 0 662 | /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */ 663 | /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */ 664 | /* if font size >= 256, must be configured as image cache */ 665 | #define LV_FREETYPE_SBIT_CACHE 0 666 | /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ 667 | /* (0:use system defaults) */ 668 | #define LV_FREETYPE_CACHE_FT_FACES 0 669 | #define LV_FREETYPE_CACHE_FT_SIZES 0 670 | #endif 671 | #endif 672 | 673 | /*Rlottie library*/ 674 | #define LV_USE_RLOTTIE 0 675 | 676 | /*FFmpeg library for image decoding and playing videos 677 | *Supports all major image formats so do not enable other image decoder with it*/ 678 | #define LV_USE_FFMPEG 0 679 | #if LV_USE_FFMPEG 680 | /*Dump input information to stderr*/ 681 | #define LV_FFMPEG_DUMP_FORMAT 0 682 | #endif 683 | 684 | /*----------- 685 | * Others 686 | *----------*/ 687 | 688 | /*1: Enable API to take snapshot for object*/ 689 | #define LV_USE_SNAPSHOT 0 690 | 691 | /*1: Enable Monkey test*/ 692 | #define LV_USE_MONKEY 0 693 | 694 | /*1: Enable grid navigation*/ 695 | #define LV_USE_GRIDNAV 0 696 | 697 | /*1: Enable lv_obj fragment*/ 698 | #define LV_USE_FRAGMENT 0 699 | 700 | /*1: Support using images as font in label or span widgets */ 701 | #define LV_USE_IMGFONT 0 702 | 703 | /*1: Enable a published subscriber based messaging system */ 704 | #define LV_USE_MSG 0 705 | 706 | /*1: Enable Pinyin input method*/ 707 | /*Requires: lv_keyboard*/ 708 | #define LV_USE_IME_PINYIN 0 709 | #if LV_USE_IME_PINYIN 710 | /*1: Use default thesaurus*/ 711 | /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ 712 | #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 713 | /*Set the maximum number of candidate panels that can be displayed*/ 714 | /*This needs to be adjusted according to the size of the screen*/ 715 | #define LV_IME_PINYIN_CAND_TEXT_NUM 6 716 | 717 | /*Use 9 key input(k9)*/ 718 | #define LV_IME_PINYIN_USE_K9_MODE 1 719 | #if LV_IME_PINYIN_USE_K9_MODE == 1 720 | #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 721 | #endif // LV_IME_PINYIN_USE_K9_MODE 722 | #endif 723 | 724 | /*================== 725 | * EXAMPLES 726 | *==================*/ 727 | 728 | /*Enable the examples to be built with the library*/ 729 | #define LV_BUILD_EXAMPLES 1 730 | 731 | /*=================== 732 | * DEMO USAGE 733 | ====================*/ 734 | 735 | /*Show some widget. It might be required to increase `LV_MEM_SIZE` */ 736 | #define LV_USE_DEMO_WIDGETS 0 737 | #if LV_USE_DEMO_WIDGETS 738 | #define LV_DEMO_WIDGETS_SLIDESHOW 0 739 | #endif 740 | 741 | /*Demonstrate the usage of encoder and keyboard*/ 742 | #define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 743 | 744 | /*Benchmark your system*/ 745 | #define LV_USE_DEMO_BENCHMARK 1 746 | #if LV_USE_DEMO_BENCHMARK 747 | /*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ 748 | #define LV_DEMO_BENCHMARK_RGB565A8 1 749 | #endif 750 | 751 | /*Stress test for LVGL*/ 752 | #define LV_USE_DEMO_STRESS 0 753 | 754 | /*Music player demo*/ 755 | #define LV_USE_DEMO_MUSIC 0 756 | #if LV_USE_DEMO_MUSIC 757 | #define LV_DEMO_MUSIC_SQUARE 1 758 | #define LV_DEMO_MUSIC_LANDSCAPE 1 759 | #define LV_DEMO_MUSIC_ROUND 1 760 | #define LV_DEMO_MUSIC_LARGE 1 761 | #define LV_DEMO_MUSIC_AUTO_PLAY 1 762 | #endif 763 | 764 | /*--END OF LV_CONF_H--*/ 765 | 766 | #endif /*LV_CONF_H*/ 767 | 768 | #endif /*End of "Content enable"*/ 769 | -------------------------------------------------------------------------------- /examples/TP_firmware_update/TP_firmware_update.ino: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * 4 | * Note: 5 | * this example is only for updating firmware of TouchPad. 6 | * If your touch point coordinates are accurate, ignore this. 7 | * 8 | */ 9 | 10 | #include 11 | #include "chsc6x_ramcode.h" 12 | #include "chsc6x_fw_upgrade.h" 13 | 14 | #define TOUCH_INT (D7) 15 | #define CHSC6X_READ_LEN (5) 16 | #define CHSC6X_I2C_ID (0x2e) 17 | 18 | #define OS_OK (0) 19 | #define OS_ERROR (1) 20 | #define TP_RETRY_CNT (2) 21 | #define TP_RETRY_CNT2 (3) 22 | #define TP_RETRY_CNT3 (5) 23 | 24 | typedef struct sm_touch_dev 25 | { 26 | int int_pin; 27 | int rst_pin; 28 | }sm_touch_dev, *psm_touch_dev; 29 | 30 | struct ts_event { 31 | uint16_t x; /*x coordinate */ 32 | uint16_t y; /*y coordinate */ 33 | int flag; /* touch event flag: 0 -- down; 4-- up; 8 -- contact */ 34 | int id; /*touch ID */ 35 | }; 36 | 37 | static uint32_t g_chsc6x_cfg_ver = 0; 38 | static uint32_t g_chsc6x_boot_ver = 0; 39 | static uint8_t g_cfg_update_flag = 0; 40 | static uint8_t g_boot_update_flag = 0; 41 | static uint8_t g_no_upd_req_flag = 0;//no updatae require 42 | static uint32_t g_mccode; /* 1:3536 */ 43 | static unsigned int g_upgrade_flag = 0; /* 0:driver init upgrade, 1:OTA upgrade */ 44 | struct ts_fw_infos *g_pfw_infos; 45 | uint8_t g_i2c_addr = CHSC6X_I2C_ID ; 46 | 47 | int chsc6x_tp_reset(chsc6x_reset_e type) 48 | { 49 | chsc6x_info("reset tp!\n"); 50 | digitalWrite(D0, LOW); 51 | chsc6x_msleep(20); 52 | digitalWrite(D0, HIGH); 53 | chsc6x_msleep(type == HW_ACTIVE_RESET ? 2 : 30); 54 | return OS_OK; 55 | } 56 | 57 | 58 | /* RETURN:0->pass else->fail */ 59 | int chsc6x_read_bytes_u8addr(uint8_t id, uint8_t adr, uint8_t *rxbuf, uint16_t lenth) 60 | { 61 | uint16_t ofs = 0; 62 | uint16_t pl_len = 0; 63 | while(lenth > 0) { 64 | pl_len = (lenth > MAX_IIC_RD_LEN) ? MAX_IIC_RD_LEN : lenth; 65 | Wire.beginTransmission(CHSC6X_I2C_ID); 66 | Wire.write(adr); 67 | if (Wire.endTransmission() != 0) { 68 | return ofs; 69 | } 70 | delay(1); 71 | Wire.requestFrom(CHSC6X_I2C_ID, pl_len); 72 | Wire.readBytes(rxbuf + ofs, pl_len); 73 | ofs += pl_len; 74 | lenth -= pl_len; 75 | } 76 | return lenth; 77 | } 78 | 79 | /* RETURN:0->pass else->fail */ 80 | int chsc6x_read_bytes_u16addr(uint8_t id, uint16_t adr, uint8_t *rxbuf, uint16_t lenth) 81 | { 82 | uint16_t ofs = 0; 83 | uint16_t pl_len = 0; 84 | while(lenth > 0) { 85 | pl_len = (lenth > MAX_IIC_RD_LEN) ? MAX_IIC_RD_LEN : lenth; 86 | Wire.beginTransmission(CHSC6X_I2C_ID); 87 | Wire.write((uint8_t)((adr + ofs) >> 8)); 88 | Wire.write((uint8_t)(adr + ofs)); 89 | if (Wire.endTransmission() != 0) { 90 | return ofs; 91 | } 92 | delay(1); 93 | Wire.requestFrom(CHSC6X_I2C_ID, pl_len); 94 | Wire.readBytes(rxbuf + ofs, pl_len); 95 | ofs += pl_len; 96 | lenth -= pl_len; 97 | } 98 | return lenth; 99 | } 100 | 101 | /* RETURN:0->pass else->fail */ 102 | int chsc6x_write_bytes_u16addr(uint8_t id, uint16_t adr, uint8_t *txbuf, uint16_t lenth) 103 | { 104 | uint16_t ofs = 0; 105 | uint16_t pl_len = 0; 106 | while(lenth > 0) { 107 | pl_len = (lenth > MAX_IIC_WR_LEN) ? MAX_IIC_WR_LEN : lenth; 108 | Wire.beginTransmission(CHSC6X_I2C_ID); 109 | Wire.write((uint8_t)((adr + ofs) >> 8)); 110 | Wire.write((uint8_t)(adr + ofs)); 111 | Wire.write(txbuf + ofs, pl_len); 112 | if (Wire.endTransmission() != 0) { 113 | return lenth; 114 | } 115 | ofs += pl_len; 116 | lenth -= pl_len; 117 | } 118 | return lenth; 119 | } 120 | 121 | /* <0 : i2c error */ 122 | /* 0: direct address mode */ 123 | /* 1: protect mode */ 124 | static int chsc6x_get_i2cmode(void) 125 | { 126 | uint8_t regData[4]; 127 | 128 | if (chsc6x_read_bytes_u16addr(g_i2c_addr, 0x01, regData, 3)) 129 | { 130 | return -OS_ERROR; 131 | } 132 | 133 | if ((0x5c == regData[0]) && (regData[2] == 0X01)) 134 | { 135 | return DIRECTLY_MODE; 136 | } 137 | 138 | return DEDICATE_MODE; 139 | } 140 | 141 | /* 0:successful */ 142 | int chsc6x_set_dd_mode(void) 143 | { 144 | int mod = -1; 145 | int ret = 0; 146 | uint8_t retry = 0; 147 | 148 | ret = chsc6x_get_i2cmode(); 149 | if (ret < 0) 150 | { 151 | return ret; 152 | } 153 | if (ret == DIRECTLY_MODE) 154 | { 155 | return 0; 156 | } 157 | while (retry++ < TP_RETRY_CNT3) 158 | { 159 | chsc6x_msleep(20); 160 | chsc6x_write_bytes_u16addr(g_i2c_addr, 0x42bd, cmd_2dma_42bd, 6); 161 | chsc6x_msleep(30); 162 | mod = chsc6x_get_i2cmode(); 163 | if (mod == DIRECTLY_MODE) 164 | { 165 | break; 166 | } 167 | } 168 | 169 | return (mod == DIRECTLY_MODE) ? OS_OK : -OS_ERROR; 170 | } 171 | 172 | /* ret=0 : successful */ 173 | /* write with read-back check, in dd mode */ 174 | int chsc6x_bulk_down_check(uint8_t *pbuf, uint16_t addr, uint16_t len) 175 | { 176 | uint32_t j, k, retry; 177 | uint8_t rback[128]; 178 | 179 | while (len) 180 | { 181 | k = (len < 128) ? len : 128; 182 | retry = 0; 183 | do 184 | { 185 | rback[k - 1] = pbuf[k - 1] + 1; 186 | chsc6x_write_bytes_u16addr(g_i2c_addr, addr, pbuf, k); 187 | chsc6x_read_bytes_u16addr(g_i2c_addr, addr, rback, k); 188 | for (j = 0; j < k; j++) 189 | { 190 | if (pbuf[j] != rback[j]) 191 | { 192 | break; 193 | } 194 | } 195 | if (j >= k) 196 | { 197 | break; /* match */ 198 | } 199 | } while (++retry < 3); 200 | 201 | if (j < k) 202 | { 203 | break; 204 | } 205 | 206 | addr += k; 207 | pbuf += k; 208 | len -= k; 209 | } 210 | 211 | return (int)len; 212 | } 213 | 214 | static uint16_t chsc6x_checksum_u16(uint16_t *buf, uint16_t length) 215 | { 216 | uint16_t sum, len, i; 217 | 218 | sum = 0; 219 | len = length >> 1; 220 | for (i = 0; i < len; i++) 221 | { 222 | sum += buf[i]; 223 | } 224 | 225 | return sum; 226 | } 227 | 228 | static uint32_t chsc6x_checksumEx(uint8_t *buf, uint16_t length) 229 | { 230 | uint32_t combChk; 231 | uint16_t k, check, checkEx; 232 | 233 | check = 0; 234 | checkEx = 0; 235 | for (k = 0; k < length; k++) 236 | { 237 | check += buf[k]; 238 | checkEx += (uint16_t) (k * buf[k]); 239 | } 240 | combChk = (checkEx << 16) | check; 241 | 242 | return combChk; 243 | } 244 | 245 | /* 0:successful */ 246 | static int chsc6x_download_ramcode(const uint8_t *pcode, uint16_t len) 247 | { 248 | uint8_t dwr, retry; 249 | int ret = -2; 250 | int sig; 251 | const uint8_t * ramcode; 252 | ramcode = pcode; 253 | 254 | if (chsc6x_set_dd_mode()) 255 | { 256 | return -OS_ERROR; 257 | } 258 | 259 | sig = (int) ramcode[3]; 260 | sig = (sig<<8) + (int) ramcode[2]; 261 | sig = (sig<<8) + (int) ramcode[1]; 262 | sig = (sig<<8) + (int) ramcode[0]; 263 | 264 | if (sig == 0x6d6f8008) 265 | { 266 | sig = 0; 267 | chsc6x_read_bytes_u16addr(g_i2c_addr, 0x8000, (uint8_t *) &sig, 4); 268 | if (sig == 0x6d6f8008) 269 | { 270 | return 0; 271 | } 272 | } 273 | 274 | dwr = 0x05; 275 | if (0 == chsc6x_bulk_down_check(&dwr, 0x0602, 1))/* stop mcu */ 276 | { 277 | dwr = 0x00; 278 | chsc6x_bulk_down_check(&dwr, 0x0643, 1);/* disable irq */ 279 | } 280 | else 281 | { 282 | return -OS_ERROR; 283 | } 284 | if (0 == chsc6x_bulk_down_check((uint8_t *)ramcode, 0x8000, len)) 285 | { 286 | dwr = 0x88; 287 | retry = 0; 288 | do 289 | { 290 | ret = chsc6x_write_bytes_u16addr(g_i2c_addr, 0x0602, &dwr, 1); 291 | } while ((++retry < 3) && (ret != 0)); 292 | } 293 | 294 | chsc6x_msleep(30);// let caller decide the delay time ? 295 | 296 | return ret; 297 | } 298 | 299 | /* return 0=successful: send cmd and get rsp. */ 300 | static int chsc6x_cmd_send(ctp_tst_wr_t *ptchcw, ctp_tst_rd_t *pcr) 301 | { 302 | int ret; 303 | uint32_t retry; 304 | 305 | retry = 0; 306 | chsc6x_write_bytes_u16addr(g_i2c_addr, RSP_ADDR, (uint8_t *) &retry, 1); 307 | 308 | /* send command */ 309 | ptchcw->idv = ~(ptchcw->id); 310 | ptchcw->tag = 0x35; 311 | ptchcw->chk = 1 + ~(chsc6x_checksum_u16((uint16_t *) ptchcw, LEN_CMD_CHK_TX)); 312 | ptchcw->tag = 0x30; 313 | ret = chsc6x_write_bytes_u16addr(g_i2c_addr, CMD_ADDR, (uint8_t *) ptchcw, LEN_CMD_PKG_TX); 314 | if (ret) 315 | { 316 | goto exit; 317 | } 318 | ptchcw->tag = 0x35; 319 | ret = chsc6x_write_bytes_u16addr(g_i2c_addr, CMD_ADDR + 9, (uint8_t *) &(ptchcw->tag), 1); 320 | if (ret) 321 | { 322 | goto exit; 323 | } 324 | /* polling rsp, the caller must init rsp buffer. */ 325 | ret = -1; 326 | retry = 0; 327 | while (retry++ < 100)/* 2s */ 328 | { 329 | chsc6x_msleep(20); 330 | if (chsc6x_read_bytes_u16addr(g_i2c_addr, RSP_ADDR, (uint8_t *) pcr, 1)) 331 | { 332 | break; 333 | } 334 | 335 | if (ptchcw->id != pcr->id) 336 | { 337 | continue; 338 | } 339 | /* chsc6x_msleep(50); */ 340 | chsc6x_read_bytes_u16addr(g_i2c_addr, RSP_ADDR, (uint8_t *) pcr, LEN_RSP_CHK_RX); 341 | if (!chsc6x_checksum_u16((uint16_t *) pcr, LEN_RSP_CHK_RX)) 342 | { 343 | if ((ptchcw->id == pcr->id) && (0 == pcr->cc)) 344 | { 345 | ret = 0; 346 | } 347 | } 348 | break; 349 | } 350 | exit: 351 | return ret; 352 | 353 | } 354 | 355 | /* return 0=successful */ 356 | static int chsc6x_read_burn_space(uint8_t *pdes, uint16_t adr, uint16_t len) 357 | { 358 | int rsp = -1; 359 | uint32_t left = len; 360 | uint32_t combChk, retry; 361 | ctp_tst_wr_t m_cmd; 362 | ctp_tst_rd_t m_rsp; 363 | 364 | m_cmd.id = 0x31; 365 | m_cmd.resv = 0x03; 366 | while (left) 367 | { 368 | len = (left > MAX_BULK_SIZE) ? MAX_BULK_SIZE : left; 369 | 370 | m_cmd.d0 = adr; 371 | m_cmd.d1 = len; 372 | 373 | rsp = -1; 374 | retry = 0; 375 | while (retry++ < 3) 376 | { 377 | m_rsp.id = 0; 378 | if (chsc6x_cmd_send(&m_cmd, &m_rsp) == 0X0) 379 | { 380 | chsc6x_read_bytes_u16addr(g_i2c_addr, TXRX_ADDR, pdes, len); 381 | combChk = chsc6x_checksumEx(pdes, len); 382 | if (m_rsp.d0 == (uint16_t)combChk) 383 | { 384 | if (m_rsp.sn == (uint16_t)(combChk >> 16)) 385 | { 386 | rsp = 0; 387 | break; 388 | } 389 | } 390 | } 391 | } 392 | 393 | if (rsp < 0) 394 | { 395 | break; 396 | } 397 | left -= len; 398 | adr += len; 399 | pdes += len; 400 | } 401 | 402 | return rsp; 403 | } 404 | 405 | static int chsc6x_write_burn_space(uint8_t *psrc, uint16_t adr, uint16_t len) 406 | { 407 | int rsp = 0; 408 | uint16_t left = len; 409 | uint32_t retry, combChk; 410 | ctp_tst_wr_t m_cmd; 411 | ctp_tst_rd_t m_rsp; 412 | 413 | m_cmd.id = 0x30; 414 | m_cmd.resv = 0x11; 415 | 416 | while (left) 417 | { 418 | len = (left > MAX_BULK_SIZE) ? MAX_BULK_SIZE : left; 419 | combChk = chsc6x_checksumEx(psrc, len); 420 | 421 | m_cmd.d0 = adr; 422 | m_cmd.d1 = len; 423 | m_cmd.d2 = (uint16_t) combChk; 424 | m_cmd.s2Pad0 = (uint16_t) (combChk >> 16); 425 | 426 | rsp = -1; /* avoid dead loop */ 427 | retry = 0; 428 | while (retry < 3) 429 | { 430 | chsc6x_write_bytes_u16addr(g_i2c_addr, TXRX_ADDR, psrc, len); 431 | m_rsp.id = 0; 432 | rsp = chsc6x_cmd_send(&m_cmd, &m_rsp); 433 | if (rsp < 0) 434 | { 435 | if ((m_rsp.d0 == 0X05) && (m_rsp.cc == 0X09))/* fotal error */ 436 | { 437 | break; 438 | } 439 | retry++; 440 | } 441 | else 442 | { 443 | left -= len; 444 | adr += len; 445 | psrc += len; 446 | break; 447 | } 448 | } 449 | 450 | if (rsp < 0) 451 | { 452 | break; 453 | } 454 | } 455 | 456 | return (!left) ? 0 : -1; 457 | } 458 | 459 | static int is_valid_cfg_data(uint16_t *ptcfg) 460 | { 461 | if (0 == ptcfg) 462 | { 463 | return 0; 464 | } 465 | 466 | if ((uint8_t) (ptcfg[53] & 0xff) != 0x5c) 467 | { 468 | chsc6x_err("chsc6x: cfg iic adr error! \r\n"); 469 | return 0; 470 | } 471 | 472 | if (chsc6x_checksum_u16(ptcfg, 204)) 473 | { 474 | chsc6x_err("chsc6x: cfg chk_sum error! \r\n"); 475 | return 0; 476 | } 477 | 478 | return 1; 479 | } 480 | 481 | /*return: 1 allow; 0 no-allow*/ 482 | static int is_tpcfg_update_allow(uint16_t *ptcfg) 483 | { 484 | uint32_t u32tmp; 485 | uint16_t vnow, vbuild; 486 | 487 | if (0 == g_chsc6x_cfg_ver)/* no available version information */ 488 | { 489 | return 0; 490 | } 491 | 492 | if (0 == is_valid_cfg_data(ptcfg)) 493 | { 494 | return 0; 495 | } 496 | 497 | u32tmp = ptcfg[1]; 498 | u32tmp = (u32tmp << 16) | ptcfg[0]; 499 | if ((g_chsc6x_cfg_ver & 0x3ffffff) != (u32tmp & 0x3ffffff)) 500 | { 501 | return 0; 502 | } 503 | 504 | vnow = (g_chsc6x_cfg_ver >> 26) & 0x3f; 505 | vbuild = (u32tmp >> 26) & 0x3f; 506 | chsc6x_info("chsc6x: cfg_vnow: 0x%x,cfg_vbuild: 0x%x \r\n", vnow, vbuild); 507 | if (0 == g_upgrade_flag && vbuild <= vnow) 508 | { 509 | return 0; //driver init upgrade, must vbuild > vnow 510 | } 511 | if(1 == g_upgrade_flag && vbuild == vnow) 512 | { 513 | return 0; //OTA upgrade just vbuild != vnow 514 | } 515 | 516 | return 1; 517 | } 518 | 519 | static int chsc6x_update_fcomp_cfg(uint16_t *ptcfg) 520 | { 521 | if (chsc6x_download_ramcode(fw_fcode_burn, sizeof(fw_fcode_burn))) 522 | { 523 | chsc6x_err("chsc6x: update fcomp_cfg: ram-code error! \r\n"); 524 | return -OS_ERROR; 525 | } 526 | 527 | if (chsc6x_write_burn_space((uint8_t *)ptcfg, 0x8000, 204)) 528 | { 529 | chsc6x_err("chsc6x: update fcomp_cfg fail! \r\n"); 530 | return -OS_ERROR; 531 | } 532 | 533 | g_chsc6x_cfg_ver = (ptcfg[1] << 16) | ptcfg[0]; 534 | g_pfw_infos->chsc6x_cfg_version = g_chsc6x_cfg_ver>>26; 535 | g_cfg_update_flag = 1; 536 | return 0; 537 | } 538 | 539 | static int chsc6x_update_fcomp_boot(uint8_t *pdata, uint16_t len) 540 | { 541 | uint8_t buf[1] = {0x4b}; 542 | if (chsc6x_download_ramcode(fw_fcode_burn, sizeof(fw_fcode_burn))) 543 | { 544 | chsc6x_err("chsc6x: update fcomp_boot: ram-code error! \r\n"); 545 | return -OS_ERROR; 546 | } 547 | 548 | //pdata[8] = 0xff;//const 549 | if (chsc6x_write_burn_space((uint8_t *)pdata, 0x00, len)) 550 | { 551 | chsc6x_err("chsc6x: update fcomp_boot fail! \r\n"); 552 | return -OS_ERROR; 553 | } 554 | #if 1 //const 555 | if (chsc6x_write_burn_space((uint8_t *)buf, 0x08, 1)) 556 | { 557 | chsc6x_err("chsc6x:update fcomp_boot last sig-byte fail! \r\n"); 558 | return -OS_ERROR; 559 | } 560 | #endif 561 | g_chsc6x_boot_ver = pdata[5]; 562 | g_chsc6x_boot_ver = (g_chsc6x_boot_ver<<8) + pdata[4]; 563 | g_pfw_infos->chsc6x_boot_version = g_chsc6x_boot_ver; 564 | g_boot_update_flag = 1; 565 | chsc6x_info("chsc6x: fcomp_boot update pass! \r\n"); 566 | 567 | return 0; 568 | } 569 | 570 | 571 | /*return: 0 SUCESS else FAIL*/ 572 | static int chsc6x_get_running_cfg(uint16_t *ptcfg, uint16_t addr) 573 | { 574 | int retry, err_type; 575 | retry = 0; 576 | err_type = 0; 577 | 578 | chsc6x_set_dd_mode(); 579 | while (++retry < TP_RETRY_CNT3) 580 | { 581 | err_type = 0; 582 | if (chsc6x_read_bytes_u16addr(g_i2c_addr, addr, (uint8_t *) ptcfg, 204)) 583 | { 584 | chsc6x_msleep(20); 585 | err_type = 2; /* i2c error */ 586 | continue; 587 | } 588 | 589 | if (0 == is_valid_cfg_data(ptcfg)) { 590 | chsc6x_set_dd_mode(); 591 | err_type = 1; /* data error or no data */ 592 | chsc6x_msleep(20); 593 | continue; 594 | } 595 | break; 596 | } 597 | 598 | return err_type; 599 | 600 | } 601 | 602 | /*find factory first burnning cfg info*/ 603 | /*return: 0 SUCESS else FAIL*/ 604 | static int chsc6x_find_ver(void) 605 | { 606 | uint16_t buf_tmpcfg[102]; 607 | if (chsc6x_download_ramcode(fw_fcode_burn, sizeof(fw_fcode_burn))) 608 | { 609 | chsc6x_err("chsc6x: find factory cfg: ram-code error! \r\n"); 610 | return -OS_ERROR; 611 | } 612 | 613 | if (chsc6x_read_burn_space((uint8_t *) buf_tmpcfg, 0xf000, 204)) 614 | { 615 | chsc6x_err("chsc6x: read factory cfg fail! \r\n"); 616 | return -OS_ERROR; 617 | } 618 | 619 | if (is_valid_cfg_data(buf_tmpcfg)) 620 | { 621 | chsc6x_info("chsc6x: read factory cfg OK. \r\n"); 622 | g_chsc6x_cfg_ver = (uint32_t)buf_tmpcfg[1]; 623 | g_chsc6x_cfg_ver = (g_chsc6x_cfg_ver<<16) + (uint32_t)buf_tmpcfg[0]; 624 | g_chsc6x_cfg_ver = g_chsc6x_cfg_ver&0x3ffffff; 625 | g_pfw_infos->chsc6x_cfg_version = 0; 626 | g_pfw_infos->chsc6x_vendor_id = (((g_chsc6x_cfg_ver>>9)&0x7F) | ((g_chsc6x_cfg_ver>>22&0x03)<<7)); 627 | g_pfw_infos->chsc6x_project_id = ((g_chsc6x_cfg_ver&0x01FF) | ((g_chsc6x_cfg_ver>>20&0x03)<<9)); 628 | } 629 | 630 | return 0; 631 | } 632 | 633 | static int chsc6x_cfg_update(uint16_t *parray, uint32_t cfg_num) 634 | { 635 | uint32_t k; 636 | int new_idx_active = -1; 637 | 638 | chsc6x_info("chsc6x: g_chsc6x_cfg_ver is 0x%x \r\n",g_chsc6x_cfg_ver); 639 | 640 | if (0 == g_chsc6x_cfg_ver)/* no available version information */ 641 | { 642 | chsc6x_err("chsc6x: no current version information! \r\n"); 643 | return -OS_ERROR; 644 | } 645 | 646 | for (k = 0; k < cfg_num; k++) 647 | { 648 | if (1 == is_tpcfg_update_allow(parray)) 649 | { 650 | new_idx_active = k; 651 | chsc6x_info("chsc6x: new_idx_active is %d \r\n", new_idx_active); 652 | break; 653 | } 654 | parray = parray + 102; 655 | } 656 | 657 | if (new_idx_active < 0) 658 | { 659 | chsc6x_info("chsc6x: 3536 cfg not need update! \r\n"); 660 | return -OS_ERROR; 661 | } 662 | 663 | if (chsc6x_set_dd_mode()) 664 | { 665 | chsc6x_err("chsc6x: cfg update error:can't control hw mode! \r\n"); 666 | return -OS_ERROR; 667 | } 668 | 669 | if (0 == chsc6x_update_fcomp_cfg(parray)) 670 | { 671 | chsc6x_info("chsc6x: fcomp_cfg update pass! \r\n"); 672 | } 673 | else 674 | { 675 | chsc6x_err("chsc6x: fcomp_cfg update fail! \r\n"); 676 | } 677 | 678 | return 0; /* need hw reset */ 679 | } 680 | 681 | static int chsc6x_boot_ver_comp(uint32_t ver) 682 | { 683 | if (0 == g_chsc6x_boot_ver) 684 | { 685 | return 1; //try to force update 686 | } 687 | chsc6x_info("chsc6x: boot_vnow: 0x%x,boot_vbuild: 0x%x \r\n", g_chsc6x_boot_ver, ver); 688 | if (0 == g_upgrade_flag && ver > g_chsc6x_boot_ver ) 689 | { 690 | return 1; //driver init upgrade, must vbuild > vnow 691 | } 692 | if (1 == g_upgrade_flag && ver != g_chsc6x_boot_ver ) { 693 | return 1; //OTA upgrade just vbuild != vnow */ 694 | } 695 | return 0; //no-need update boot 696 | } 697 | 698 | /*return: 0,no-need update | update succeed; 1,update failed*/ 699 | static int chsc6x_boot_update(uint8_t *pdata, uint16_t boot_len) 700 | { 701 | uint32_t ver = 0; 702 | 703 | ver = pdata[5]; 704 | ver = (ver<<8) + pdata[4]; 705 | 706 | if (0 == chsc6x_boot_ver_comp(ver)) 707 | { 708 | chsc6x_info("chsc6x: 3536 boot not need update! \r\n"); 709 | g_no_upd_req_flag = 1; 710 | return 0; 711 | } 712 | 713 | return chsc6x_update_fcomp_boot(pdata, boot_len); 714 | } 715 | 716 | /*analysis the ".h fw" and check burn*/ 717 | /*return: 0 SUCESS else FAIL*/ 718 | static int chsc6x_update_compat_ctl(uint8_t *pupd, int len) 719 | { 720 | uint32_t k; 721 | uint32_t n; 722 | uint32_t offset; 723 | uint32_t *vlist; 724 | 725 | int ret = -1; 726 | struct chsc6x_updfile_header *upd_header; 727 | 728 | if (len < sizeof(struct chsc6x_updfile_header)) 729 | { 730 | return -OS_ERROR; 731 | } 732 | 733 | upd_header = (struct chsc6x_updfile_header *) pupd; 734 | 735 | if (upd_header->sig != 0x43534843) 736 | { 737 | return -OS_ERROR; 738 | } 739 | 740 | n = upd_header->n_cfg; 741 | offset = (upd_header->n_match * 4) + sizeof(struct chsc6x_updfile_header); 742 | 743 | if ((offset + upd_header->len_cfg + upd_header->len_boot) != len) 744 | { 745 | return -OS_ERROR; 746 | } 747 | if ((n * 204) != upd_header->len_cfg) 748 | { 749 | return -OS_ERROR; 750 | } 751 | if (n != 0) 752 | { 753 | chsc6x_cfg_update((uint16_t *) (pupd + offset), n); 754 | } 755 | 756 | n = upd_header->n_match; 757 | if (n != 0) 758 | { 759 | vlist = (uint32_t *) (pupd + sizeof(struct chsc6x_updfile_header)); 760 | offset = offset + upd_header->len_cfg; 761 | for (k=0; k < n; k++) 762 | { 763 | if (vlist[k] == (g_chsc6x_cfg_ver & 0xffffff)) 764 | { 765 | ret = chsc6x_boot_update((pupd + offset), upd_header->len_boot); 766 | if(0 == ret) 767 | { 768 | break; 769 | } 770 | else 771 | { 772 | return -OS_ERROR; 773 | } 774 | } 775 | } 776 | } 777 | return 0; 778 | } 779 | 780 | /*return: 0 SUCESS else FAIL*/ 781 | static int chsc6x_do_update_ifneed(uint8_t* p_fw_upd, uint32_t fw_len) 782 | { 783 | const uint8_t *fupd; 784 | uint32_t fw_size; 785 | int ret = -1; 786 | 787 | #if CHSC6X_MUL_VENDOR_UPGRADE 788 | if(41 == g_pfw_infos->chsc6x_vendor_id && 27 == g_pfw_infos->chsc6x_project_id) 789 | { 790 | fupd = chsc_boot_41_27; 791 | fw_size = sizeof(chsc_boot_41_27); 792 | ret = chsc6x_update_compat_ctl((uint8_t *) fupd, fw_size); 793 | } 794 | else if(29 == g_pfw_infos->chsc6x_vendor_id && 08 == g_pfw_infos->chsc6x_project_id) 795 | { 796 | fupd = chsc_boot_29_08; 797 | fw_size = sizeof(chsc_boot_29_08); 798 | ret = chsc6x_update_compat_ctl((uint8_t *) fupd, fw_size); 799 | } 800 | #else 801 | if(1 == g_upgrade_flag) { //ota upgrade 802 | fupd = p_fw_upd; 803 | fw_size = fw_len; 804 | } else { 805 | fupd = chsc_boot; 806 | fw_size = sizeof(chsc_boot); 807 | } 808 | ret = chsc6x_update_compat_ctl((uint8_t *) fupd, fw_size); 809 | #endif 810 | 811 | return ret; 812 | } 813 | 814 | static void chsc6x_tp_mccode(void) 815 | { 816 | uint32_t tmp[3]; 817 | 818 | g_mccode = 0xff; 819 | 820 | if (chsc6x_read_bytes_u16addr(g_i2c_addr, 0x8000, (uint8_t *) tmp, 12)) 821 | { 822 | chsc6x_err("chsc6x: read 0x8000-12 fail! \r\n"); 823 | return; 824 | } 825 | if ( 0x544c4e4b == tmp[2] ) /* boot code */ 826 | { 827 | if (tmp[0] == 0x35368008) 828 | { 829 | g_mccode = 1; 830 | g_chsc6x_boot_ver = tmp[1] & 0xffff; 831 | g_pfw_infos->chsc6x_boot_version = g_chsc6x_boot_ver; 832 | chsc6x_info("chsc6x: read 0x8000-12 OK! \r\n"); 833 | } 834 | } 835 | else if ( 0x544c4e00 == (tmp[2]&0xffffff00)) 836 | { 837 | if (tmp[0] == 0x35368008) 838 | { 839 | g_mccode = 1; 840 | g_chsc6x_boot_ver = 0; 841 | g_pfw_infos->chsc6x_boot_version = g_chsc6x_boot_ver; 842 | chsc6x_err("chsc6x: IC run flag error! \r\n"); 843 | } 844 | } 845 | else 846 | { /* none code */ 847 | tmp[0] = 0; 848 | if (chsc6x_read_bytes_u16addr(g_i2c_addr, 0x09, (uint8_t *) tmp, 3)) 849 | { 850 | chsc6x_err("chsc6x: read 0x09-3 fail! \r\n"); 851 | return; 852 | } 853 | if (tmp[0] == 0x5c5c5c) 854 | { 855 | g_mccode = 1; 856 | chsc6x_info("chsc6x: empty ic! \r\n"); 857 | } 858 | } 859 | } 860 | 861 | void chsc6x_get_normal_chip_id(uint8_t *id) 862 | { 863 | uint8_t cnt = 0; 864 | uint8_t data_t[4] = {0}; 865 | 866 | for(cnt=0; cnt < TP_RETRY_CNT; cnt++) 867 | { 868 | chsc6x_set_dd_mode(); 869 | if(0 != chsc6x_read_bytes_u16addr(g_i2c_addr, 0x9e6a, data_t, 2)) 870 | { 871 | continue; 872 | } 873 | if(CHSC6X_I2C_ID == data_t[0]) 874 | { 875 | *id = data_t[0]; 876 | } 877 | else 878 | { 879 | continue; 880 | } 881 | break; 882 | } 883 | } 884 | 885 | void chsc6x_get_boot_chip_id(uint8_t *id) 886 | { 887 | uint8_t try_cnt = 0; 888 | uint8_t dwr=0x05; 889 | 890 | for(try_cnt=0; try_cnt= TP_RETRY_CNT2) 909 | { 910 | chsc6x_err("chsc6x: get_boot_chip_id set_direct_mode failed. \r\n"); 911 | } 912 | } 913 | 914 | /* FUNC: get fw info in struct ts_fw_infos you can call this func anytime. 915 | PARM iic_addr: your iic addr. 916 | PARM pfw_infos: can get all fw infos in struct ts_fw_infos, after call this interface. 917 | */ 918 | void chsc6x_get_chip_info(struct ts_fw_infos *infos) 919 | { 920 | int ret, cnt = 0; 921 | uint8_t data_t[4] = {0}; 922 | 923 | for(cnt=0; cntchsc6x_cfg_version = data_t[3]>>2; 939 | infos->chsc6x_vendor_id = (data_t[1]>>1) | ((data_t[2]&0xc0)<<1); 940 | infos->chsc6x_project_id = (((data_t[1]&1)<<8) | data_t[0]) | ((data_t[2]&0x30)<<5); 941 | chsc6x_info("chsc6x: TP chip_info OK::fw_ver:%d, vendor_id:%d, prj_id:%d \r\n", infos->chsc6x_cfg_version, infos->chsc6x_vendor_id, infos->chsc6x_project_id); 942 | } 943 | chsc6x_msleep(2); 944 | ret = chsc6x_read_bytes_u16addr(g_i2c_addr, 0x8004, data_t, 2); 945 | if(0 == ret) 946 | { 947 | infos->chsc6x_boot_version = (data_t[1]<<8)|data_t[0]; 948 | chsc6x_info("chsc6x: boot_ver OK::0x%02x \r\n", infos->chsc6x_boot_version); 949 | } 950 | else 951 | { 952 | chsc6x_err("chsc6x: Get boot_ver failed! \r\n"); 953 | continue; 954 | } 955 | chsc6x_msleep(2); 956 | ret = chsc6x_read_bytes_u16addr(g_i2c_addr, 0x9e4c, data_t, 4); 957 | if(0 == ret) 958 | { 959 | infos->chsc6x_rpt_lcd_x = (data_t[1]<<8) + data_t[0]; 960 | infos->chsc6x_rpt_lcd_y = (data_t[3]<<8) + data_t[2]; 961 | chsc6x_info("chsc6x: rpt_lcd_x & rpt_lcd_y OK::%d:%d \r\n", infos->chsc6x_rpt_lcd_x, infos->chsc6x_rpt_lcd_y); 962 | } 963 | else 964 | { 965 | chsc6x_err("chsc6x: Get rpt_lcd_x & rpt_lcd_y failed! \r\n"); 966 | continue; 967 | } 968 | chsc6x_msleep(2); 969 | ret = chsc6x_read_bytes_u16addr(g_i2c_addr, 0x9e6a, data_t, 2); 970 | if(0 == ret) 971 | { 972 | infos->chsc6x_chip_id = data_t[0]; 973 | infos->chsc6x_chip_type = data_t[1]&0xf; 974 | chsc6x_info("chsc6x: chsc6x_chip_id & chsc6x_chip_type OK::0x%02x:0x%x \r\n", infos->chsc6x_chip_id, infos->chsc6x_chip_type); 975 | } 976 | else 977 | { 978 | chsc6x_err("chsc6x: Get chsc6x_chip_id & chsc6x_chip_type failed! \r\n"); 979 | continue; 980 | } 981 | break; 982 | } 983 | chsc6x_tp_reset(HW_CMD_RESET); 984 | if(cnt >= 3) 985 | { 986 | chsc6x_err("chsc6x: Get chip_info failed! \r\n"); 987 | } 988 | } 989 | 990 | /* FUNC In your systerm init process,Must call this interface function to detec if the TP IC is Chipsemi corp'. 991 | PARM pfw_infos: to get top 5 fw info in struct ts_fw_infos. 992 | PARM update_ret_flag: point value=1 update succeed; point value=0 update failed, If opend CHSC6X_AUTO_UPGRADE macro. 993 | RETURN 1:is chsc chip, 0:is not chsc chip 994 | */ 995 | int chsc6x_tp_dect(struct ts_fw_infos *pfw_infos, uint8_t *update_ret_flag) 996 | { 997 | uint8_t try_cnt; 998 | uint8_t dwr=0x05; 999 | uint16_t buf_tmpcfg[102]; 1000 | 1001 | g_mccode = 0xff; /* default */ 1002 | g_pfw_infos = pfw_infos; 1003 | 1004 | for(try_cnt=0; try_cnt= TP_RETRY_CNT2) 1022 | { 1023 | chsc6x_info("chsc6x: chsc6x_set_dd_mode failed! \r\n");//get chip id fail exit drivers init 1024 | return 0; 1025 | } 1026 | chsc6x_tp_mccode(); /* MUST: call this function there!!! */ 1027 | chsc6x_info("chsc6x: g_mccode is 0x%x \r\n",g_mccode); 1028 | 1029 | if(0xff == g_mccode) 1030 | { 1031 | chsc6x_err("chsc6x: get mccode fail! \r\n"); 1032 | return 0; 1033 | } 1034 | 1035 | /*try to get running time tp-cfg. if fail : wrong boot? wrong rom-cfg?*/ 1036 | if (0 == chsc6x_get_running_cfg(buf_tmpcfg, 0x9e00)) 1037 | { 1038 | g_chsc6x_cfg_ver = (uint32_t)buf_tmpcfg[1]; 1039 | g_chsc6x_cfg_ver = (g_chsc6x_cfg_ver<<16) + (uint32_t)buf_tmpcfg[0]; 1040 | 1041 | g_pfw_infos->chsc6x_cfg_version = g_chsc6x_cfg_ver>>26; 1042 | g_pfw_infos->chsc6x_vendor_id = (((g_chsc6x_cfg_ver>>9)&0x7F) | ((g_chsc6x_cfg_ver>>22&0x03)<<7)); 1043 | g_pfw_infos->chsc6x_project_id = ((g_chsc6x_cfg_ver&0x01FF) | ((g_chsc6x_cfg_ver>>20&0x03)<<9)); 1044 | g_pfw_infos->chsc6x_rpt_lcd_x = buf_tmpcfg[38]; 1045 | g_pfw_infos->chsc6x_rpt_lcd_y = buf_tmpcfg[39]; 1046 | g_pfw_infos->chsc6x_chip_id = buf_tmpcfg[53]&0xff; 1047 | g_pfw_infos->chsc6x_chip_type = (buf_tmpcfg[53]>>8)&0xf; 1048 | chsc6x_info("chsc6x: vid=%d,pid=%d,boot_ver=0x%x,cfg_ver=%d,chip_id=0x%x\r\n", \ 1049 | g_pfw_infos->chsc6x_vendor_id,g_pfw_infos->chsc6x_project_id,g_pfw_infos->chsc6x_boot_version, \ 1050 | g_pfw_infos->chsc6x_cfg_version,g_pfw_infos->chsc6x_chip_id \ 1051 | ); 1052 | } 1053 | else 1054 | { 1055 | if(0 == buf_tmpcfg[2] && 0 == buf_tmpcfg[3]) { 1056 | g_chsc6x_boot_ver = 0; 1057 | } 1058 | chsc6x_find_ver(); 1059 | } 1060 | 1061 | if (0 == g_chsc6x_cfg_ver) 1062 | { 1063 | chsc6x_err("chsc6x: get tp-info fail! \r\n"); 1064 | return 0; 1065 | } 1066 | #if CHSC6X_AUTO_UPGRADE 1067 | chsc6x_info("enter CHSC6X_AUTO_UPGRADE. \r\n"); 1068 | if(0 != chsc6x_do_update_ifneed(0, 0)) 1069 | { 1070 | *update_ret_flag = 0; 1071 | chsc6x_err("chsc6x: do fw update failed! \r\n"); 1072 | } 1073 | else 1074 | { 1075 | if(g_cfg_update_flag || g_boot_update_flag) 1076 | { 1077 | *update_ret_flag = 1; 1078 | chsc6x_info("chsc6x: vid=%d,pid=%d,boot_ver=0x%x,cfg_ver=%d,chip_id=0x%x\r\n", \ 1079 | g_pfw_infos->chsc6x_vendor_id,g_pfw_infos->chsc6x_project_id, \ 1080 | g_pfw_infos->chsc6x_boot_version,g_pfw_infos->chsc6x_cfg_version,g_pfw_infos->chsc6x_chip_id \ 1081 | ); 1082 | } 1083 | else if(g_no_upd_req_flag) 1084 | { 1085 | *update_ret_flag = 2; 1086 | } 1087 | } 1088 | #endif 1089 | chsc6x_tp_reset(HW_CMD_RESET); 1090 | 1091 | return 1; 1092 | } 1093 | 1094 | /* FUNC You can call this interfacce function to realize upgrade TP Firmware by OTA. 1095 | PARM pfw_infos: to get top 6 fw infos in struct ts_fw_infos, after ota upgrade. 1096 | PARM p_fw_upd: array address of the upgrade firmware array 1097 | PARM fw_len: total size of the upgrade firmware array 1098 | RETURN NULL 1099 | */ 1100 | void chsc6x_ota_upgrade_tp_fw(struct ts_fw_infos *pfw_infos, uint8_t* p_fw_upd, uint32_t fw_len) 1101 | { 1102 | uint8_t try_cnt; 1103 | uint8_t dwr=0x05; 1104 | uint16_t buf_tmpcfg[102]; 1105 | 1106 | g_mccode = 0xff; /* default */ 1107 | g_pfw_infos = pfw_infos; 1108 | 1109 | for(try_cnt=0; try_cnt= TP_RETRY_CNT2) 1127 | { 1128 | chsc6x_info("chsc6x: chsc6x_set_dd_mode failed! \r\n"); 1129 | goto exit; 1130 | } 1131 | chsc6x_tp_mccode(); /* MUST: call this function there!!! */ 1132 | chsc6x_info("chsc6x: g_mccode is 0x%x \r\n",g_mccode); 1133 | 1134 | if(0xff == g_mccode) 1135 | { 1136 | chsc6x_err("chsc6x: get mccode fail! \r\n"); 1137 | goto exit; 1138 | } 1139 | 1140 | /*try to get running time tp-cfg. if fail : wrong boot? wrong rom-cfg?*/ 1141 | if (0 == chsc6x_get_running_cfg(buf_tmpcfg, 0x9e00)) 1142 | { 1143 | g_chsc6x_cfg_ver = (uint32_t)buf_tmpcfg[1]; 1144 | g_chsc6x_cfg_ver = (g_chsc6x_cfg_ver<<16) + (uint32_t)buf_tmpcfg[0]; 1145 | 1146 | g_pfw_infos->chsc6x_cfg_version = g_chsc6x_cfg_ver>>26; 1147 | g_pfw_infos->chsc6x_vendor_id = (((g_chsc6x_cfg_ver>>9)&0x7F) | ((g_chsc6x_cfg_ver>>22&0x03)<<7)); 1148 | g_pfw_infos->chsc6x_project_id = ((g_chsc6x_cfg_ver&0x01FF) | ((g_chsc6x_cfg_ver>>20&0x03)<<9)); 1149 | g_pfw_infos->chsc6x_rpt_lcd_x = buf_tmpcfg[38]; 1150 | g_pfw_infos->chsc6x_rpt_lcd_y = buf_tmpcfg[39]; 1151 | g_pfw_infos->chsc6x_chip_id = buf_tmpcfg[53]&0xff; 1152 | g_pfw_infos->chsc6x_chip_type = (buf_tmpcfg[53]>>8)&0xf; 1153 | chsc6x_info("chsc6x: vid=%d,pid=%d,boot_ver=0x%x,cfg_ver=%d,chip_id=0x%x\r\n", \ 1154 | g_pfw_infos->chsc6x_vendor_id,g_pfw_infos->chsc6x_project_id,g_pfw_infos->chsc6x_boot_version, \ 1155 | g_pfw_infos->chsc6x_cfg_version,g_pfw_infos->chsc6x_chip_id \ 1156 | ); 1157 | } 1158 | else 1159 | { 1160 | chsc6x_find_ver(); 1161 | } 1162 | 1163 | if (0 == g_chsc6x_cfg_ver) 1164 | { 1165 | chsc6x_err("chsc6x: get tp-info fail! \r\n"); 1166 | goto exit; 1167 | } 1168 | 1169 | chsc6x_info("enter CHSC6X_OTA_UPGRADE. \r\n"); 1170 | g_upgrade_flag = 1; 1171 | if(0 != chsc6x_do_update_ifneed(p_fw_upd, fw_len)) 1172 | { 1173 | chsc6x_err("chsc6x: do fw update failed! \r\n"); 1174 | } 1175 | else 1176 | { 1177 | if(g_cfg_update_flag || g_boot_update_flag) 1178 | { 1179 | chsc6x_info("chsc6x: vid=%d,pid=%d,boot_ver=0x%x,cfg_ver=%d,chip_id=0x%x\r\n", \ 1180 | g_pfw_infos->chsc6x_vendor_id,g_pfw_infos->chsc6x_project_id, \ 1181 | g_pfw_infos->chsc6x_boot_version,g_pfw_infos->chsc6x_cfg_version,g_pfw_infos->chsc6x_chip_id \ 1182 | ); 1183 | } 1184 | } 1185 | 1186 | exit: 1187 | chsc6x_tp_reset(HW_CMD_RESET); 1188 | } 1189 | 1190 | 1191 | 1192 | void setup() { 1193 | Serial.begin(115200); 1194 | while (!Serial) { delay(100); } 1195 | // Log.begin(LOG_LEVEL_VERBOSE, &Serial); 1196 | 1197 | pinMode(TOUCH_INT, INPUT_PULLUP); 1198 | pinMode(D0, OUTPUT); 1199 | digitalWrite(D0, HIGH); 1200 | Wire.begin(); 1201 | 1202 | delay(1000); 1203 | 1204 | uint8_t ret_update; 1205 | struct ts_fw_infos fw_infos; 1206 | chsc6x_tp_dect(&fw_infos, &ret_update); 1207 | 1208 | if (chsc6x_update_compat_ctl((uint8_t *) chsc_boot, sizeof(chsc_boot)) != 0) { 1209 | chsc6x_err("chsc6x: do upgrade fail!\r\n"); 1210 | } else { 1211 | delay(1000); 1212 | chsc6x_tp_dect(&fw_infos, &ret_update); 1213 | if (g_pfw_infos->chsc6x_cfg_version == 8) 1214 | Serial.println("==== TP Firmware upgrade successful ! ===="); 1215 | } 1216 | } 1217 | 1218 | void loop() { 1219 | // put your main code here, to run repeatedly: 1220 | } 1221 | -------------------------------------------------------------------------------- /examples/TFT_eSPI_Clock/NotoSansBold15.h: -------------------------------------------------------------------------------- 1 | /* The font vlw file can be converted to a byte array using: 2 | 3 | https://tomeko.net/online_tools/file_to_hex.php?lang=en 4 | 5 | Paste the byte array into a sketch tab and add two lines 6 | at the start with a unique font name: 7 | 8 | #include 9 | const uint8_t fontName[] PROGMEM = { 10 | 11 | At the end add: 12 | 13 | }; 14 | 15 | See example below. Include the tab in the main sketch, e.g.: 16 | 17 | #include "NotoSansBold15.h" 18 | */ 19 | 20 | // #include 21 | 22 | const uint8_t NotoSansBold15[] PROGMEM = { 23 | 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x0C, 25 | 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 26 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 27 | 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 29 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 30 | 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 31 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0C, 32 | 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 34 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 36 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 37 | 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0B, 38 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x0E, 39 | 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 41 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 42 | 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 43 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 44 | 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x02, 46 | 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 48 | 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 49 | 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 50 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 51 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0B, 53 | 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 54 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 55 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 56 | 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 57 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 58 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 59 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x0C, 60 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 61 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x09, 62 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 64 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 65 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 66 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x0C, 67 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 69 | 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 70 | 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 71 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 72 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x05, 74 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 75 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 76 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 | 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 78 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 79 | 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0B, 80 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 81 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 83 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 85 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 86 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 87 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x0B, 88 | 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 89 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x07, 90 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 91 | 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 92 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 93 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 94 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x0B, 95 | 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 96 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x06, 97 | 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 98 | 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 99 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 100 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 101 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x0B, 102 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 103 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 104 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 105 | 0x00, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 106 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 107 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 108 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x0E, 109 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 110 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 111 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 112 | 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 113 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 114 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 115 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x0C, 116 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 117 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 118 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 119 | 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 120 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 121 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 122 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x0B, 123 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 124 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x09, 125 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 126 | 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 127 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 128 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0B, 129 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x0E, 130 | 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 131 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 132 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 133 | 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 134 | 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 135 | 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 136 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x0A, 137 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 138 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x08, 139 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 140 | 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 141 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 142 | 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0C, 143 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x0A, 144 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 145 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 146 | 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 147 | 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 148 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 149 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0C, 150 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x0C, 151 | 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 152 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 153 | 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 154 | 0x00, 0x00, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 155 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 156 | 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 157 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x09, 158 | 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 159 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 160 | 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 161 | 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 162 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 163 | 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 164 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x0D, 165 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 166 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 167 | 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 168 | 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 169 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 170 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0A, 171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x0A, 172 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 174 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 175 | 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 176 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 177 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x0D, 179 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 181 | 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 182 | 0x00, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 183 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 184 | 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 185 | 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x0E, 186 | 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 188 | 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 189 | 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 190 | 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xAE, 0xAE, 0x3D, 191 | 0x02, 0xFF, 0xFF, 0x52, 0x00, 0xFC, 0xFF, 0x4C, 0x00, 0xF6, 0xFF, 0x48, 0x00, 0xEE, 0xFF, 0x3F, 192 | 0x00, 0xD4, 0xFF, 0x15, 0x00, 0xB6, 0xFF, 0x08, 0x00, 0x41, 0x5D, 0x00, 0x00, 0x26, 0x39, 0x00, 193 | 0x06, 0xF6, 0xFF, 0x4C, 0x06, 0xEE, 0xFF, 0x3F, 0x00, 0x04, 0x17, 0x00, 0xAC, 0xAC, 0x00, 0xA5, 194 | 0xAE, 0x04, 0xF4, 0xF0, 0x00, 0xD6, 0xFC, 0x00, 0xDA, 0xDA, 0x00, 0xB4, 0xF4, 0x00, 0xB4, 0xB2, 195 | 0x00, 0xAC, 0xE7, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x59, 0xA7, 0x02, 196 | 0x48, 0xA7, 0x06, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xEE, 0x00, 0xA3, 0xF4, 0x00, 0x00, 0x00, 0x00, 197 | 0x00, 0xDF, 0xAE, 0x00, 0xC9, 0xB6, 0x00, 0x00, 0x08, 0xAE, 0xAE, 0xFF, 0xDF, 0xAE, 0xFC, 0xE1, 198 | 0xAE, 0x3B, 0x08, 0xBB, 0xD0, 0xFF, 0xCE, 0xCE, 0xFF, 0xCE, 0xBB, 0x3F, 0x00, 0x00, 0x66, 0xFF, 199 | 0x1F, 0x5B, 0xFF, 0x2A, 0x00, 0x00, 0x41, 0x63, 0xC3, 0xFA, 0x63, 0xC1, 0xFC, 0x63, 0x5D, 0x00, 200 | 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x00, 0x00, 0x02, 0xFC, 0x96, 0x02, 0xFC, 201 | 0x9D, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x57, 0x33, 0xFF, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x57, 202 | 0xFF, 0x30, 0x59, 0xFF, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x3D, 0x00, 0x00, 0x00, 203 | 0x00, 0x00, 0x02, 0x6E, 0xC9, 0x44, 0x06, 0x00, 0x00, 0x68, 0xEE, 0xFF, 0xFF, 0xFF, 0xFC, 0x85, 204 | 0x30, 0xFF, 0xFF, 0xC3, 0xDF, 0xA1, 0xD8, 0x5F, 0x55, 0xFF, 0xF0, 0x48, 0xB4, 0x00, 0x00, 0x00, 205 | 0x17, 0xF2, 0xFF, 0xEB, 0xC9, 0x0C, 0x00, 0x00, 0x00, 0x33, 0xD0, 0xFF, 0xFF, 0xF6, 0x8C, 0x08, 206 | 0x00, 0x00, 0x00, 0x6A, 0xF0, 0xFF, 0xFF, 0xAC, 0x02, 0x00, 0x00, 0x44, 0xB4, 0x5B, 0xFF, 0xF8, 207 | 0x50, 0xCE, 0x85, 0x83, 0xCE, 0xAE, 0xFF, 0xD6, 0x41, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x35, 208 | 0x00, 0x0C, 0x4A, 0x83, 0xCE, 0x44, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xA7, 0x00, 0x00, 0x00, 209 | 0x00, 0x5D, 0xC9, 0xC7, 0x57, 0x00, 0x00, 0x00, 0x3F, 0xAE, 0x41, 0x00, 0x00, 0x2A, 0xFF, 0xE3, 210 | 0xE3, 0xFF, 0x28, 0x00, 0x00, 0xD2, 0xDF, 0x06, 0x00, 0x00, 0x6A, 0xFF, 0x5D, 0x5B, 0xFF, 0x70, 211 | 0x00, 0x61, 0xFF, 0x59, 0x00, 0x00, 0x00, 0x94, 0xFF, 0x50, 0x50, 0xFF, 0x94, 0x06, 0xE5, 0xCE, 212 | 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 0x5B, 0x5B, 0xFF, 0x70, 0x7F, 0xFF, 0x3B, 0x63, 0x9B, 0x59, 213 | 0x00, 0x24, 0xFC, 0xE1, 0xE1, 0xFF, 0x41, 0xF4, 0xB0, 0x83, 0xFF, 0xFA, 0xFF, 0x7B, 0x00, 0x52, 214 | 0xC7, 0xC7, 0x5D, 0x96, 0xFC, 0x24, 0xE5, 0xF6, 0x08, 0xF6, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x2A, 215 | 0xFF, 0x90, 0x00, 0xFF, 0xC5, 0x00, 0xBB, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xB2, 0xF2, 0x13, 0x00, 216 | 0xFA, 0xDA, 0x00, 0xD0, 0xFC, 0x00, 0x00, 0x00, 0x41, 0xFF, 0x77, 0x00, 0x00, 0xBD, 0xFC, 0x72, 217 | 0xFC, 0xC3, 0x00, 0x00, 0x00, 0xD2, 0xE1, 0x06, 0x00, 0x00, 0x2E, 0xE7, 0xFF, 0xE9, 0x35, 0x00, 218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x3D, 0xAC, 219 | 0xE1, 0xBB, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xFA, 0xFF, 0xF0, 0xFC, 0xFF, 0x66, 220 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 0xA7, 0x00, 0x70, 0xFF, 0xA3, 0x00, 0x00, 0x00, 0x00, 221 | 0x00, 0x55, 0xFF, 0xC7, 0x0C, 0xBF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD4, 0xFF, 222 | 0xF4, 0xFF, 0xB2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD6, 0xFF, 0xFF, 0xCC, 0x00, 0x00, 223 | 0x72, 0xB4, 0x77, 0x00, 0x0C, 0xE9, 0xFF, 0xB4, 0xE5, 0xFF, 0x94, 0x02, 0xE5, 0xFF, 0x63, 0x00, 224 | 0x52, 0xFF, 0xFC, 0x08, 0x1D, 0xE5, 0xFF, 0xD4, 0xFF, 0xDF, 0x02, 0x00, 0x57, 0xFF, 0xFC, 0x1F, 225 | 0x00, 0x1D, 0xE7, 0xFF, 0xFF, 0x48, 0x00, 0x00, 0x15, 0xEE, 0xFF, 0xF4, 0xB0, 0xD4, 0xFF, 0xFF, 226 | 0xFF, 0xAC, 0x00, 0x00, 0x00, 0x35, 0xCC, 0xFF, 0xFF, 0xFF, 0xC1, 0x57, 0xE1, 0xFF, 0xB0, 0x04, 227 | 0x00, 0x00, 0x00, 0x06, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xAC, 0xF4, 0xF0, 228 | 0xDA, 0xDA, 0xB4, 0xB2, 0x0C, 0x0C, 0x00, 0x00, 0x4C, 0xAE, 0x46, 0x00, 0x13, 0xEB, 0xDA, 0x02, 229 | 0x00, 0x81, 0xFF, 0x68, 0x00, 0x00, 0xE3, 0xFC, 0x0C, 0x00, 0x22, 0xFF, 0xC3, 0x00, 0x00, 0x50, 230 | 0xFF, 0xA1, 0x00, 0x00, 0x59, 0xFF, 0x99, 0x00, 0x00, 0x59, 0xFF, 0x99, 0x00, 0x00, 0x4A, 0xFF, 231 | 0xA7, 0x00, 0x00, 0x11, 0xFF, 0xDA, 0x00, 0x00, 0x00, 0xCC, 0xFF, 0x22, 0x00, 0x00, 0x63, 0xFF, 232 | 0x81, 0x00, 0x00, 0x00, 0xCC, 0xF4, 0x17, 0x00, 0x00, 0x1B, 0x57, 0x28, 0x33, 0xAE, 0x5B, 0x00, 233 | 0x00, 0x00, 0xCE, 0xF8, 0x22, 0x00, 0x00, 0x52, 0xFF, 0x96, 0x00, 0x00, 0x02, 0xF6, 0xF4, 0x02, 234 | 0x00, 0x00, 0xAE, 0xFF, 0x3D, 0x00, 0x00, 0x96, 0xFF, 0x59, 0x00, 0x00, 0x66, 0xFF, 0x63, 0x00, 235 | 0x00, 0x70, 0xFF, 0x61, 0x00, 0x00, 0x9D, 0xFF, 0x57, 0x00, 0x00, 0xC1, 0xFF, 0x2C, 0x00, 0x11, 236 | 0xFC, 0xE1, 0x00, 0x00, 0x74, 0xFF, 0x79, 0x00, 0x0C, 0xE7, 0xDD, 0x08, 0x00, 0x1F, 0x57, 0x22, 237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xF2, 0x00, 238 | 0x00, 0x00, 0x1B, 0x3F, 0x02, 0xA7, 0xCE, 0x00, 0x2C, 0x2E, 0x5B, 0xFF, 0xF4, 0xE1, 0xE5, 0xE9, 239 | 0xFF, 0x9B, 0x2A, 0x61, 0xA1, 0xFF, 0xFF, 0xBB, 0x63, 0x3B, 0x00, 0x00, 0xBB, 0xEB, 0xD8, 0xDA, 240 | 0x0C, 0x00, 0x00, 0x6A, 0xFF, 0x81, 0x5B, 0xFF, 0x8E, 0x00, 0x00, 0x00, 0x50, 0x17, 0x00, 0x6A, 241 | 0x04, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xF2, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, 0x06, 242 | 0x00, 0x00, 0x02, 0x06, 0x06, 0x96, 0xFF, 0x0C, 0x06, 0x06, 0x57, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 243 | 0xFF, 0xF2, 0x33, 0x94, 0x94, 0xD4, 0xFF, 0x96, 0x94, 0x8C, 0x00, 0x00, 0x00, 0x94, 0xFF, 0x06, 244 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x50, 0x02, 245 | 0x00, 0x00, 0x00, 0x99, 0xAE, 0x33, 0x02, 0xFC, 0xFA, 0x06, 0x39, 0xFF, 0xA1, 0x00, 0x5F, 0xF2, 246 | 0x39, 0x00, 0x8C, 0xF2, 0xF2, 0xF2, 0x52, 0x88, 0xEB, 0xEB, 0xEB, 0x50, 0x00, 0x26, 0x39, 0x00, 247 | 0x06, 0xF6, 0xFF, 0x4C, 0x06, 0xEE, 0xFF, 0x3F, 0x00, 0x04, 0x17, 0x00, 0x00, 0x00, 0x00, 0x04, 248 | 0xAC, 0xAA, 0x00, 0x00, 0x00, 0x55, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x46, 0x00, 0x00, 249 | 0x17, 0xFC, 0xE5, 0x00, 0x00, 0x00, 0x74, 0xFF, 0x88, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0x28, 0x00, 250 | 0x00, 0x30, 0xFF, 0xC9, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x68, 0x00, 0x00, 0x02, 0xEB, 0xFA, 0x11, 251 | 0x00, 0x00, 0x4E, 0xFF, 0xAE, 0x00, 0x00, 0x00, 0xB2, 0xFF, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 252 | 0x72, 0xC5, 0xE3, 0xA5, 0x26, 0x00, 0x00, 0x83, 0xFF, 0xFF, 0xFA, 0xFF, 0xE9, 0x17, 0x04, 0xFA, 253 | 0xFF, 0x50, 0x02, 0xC3, 0xFF, 0x88, 0x4A, 0xFF, 0xF6, 0x00, 0x00, 0x59, 0xFF, 0xD0, 0x5B, 0xFF, 254 | 0xD4, 0x00, 0x00, 0x48, 0xFF, 0xF8, 0x63, 0xFF, 0xB4, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x5D, 0xFF, 255 | 0xC5, 0x00, 0x00, 0x46, 0xFF, 0xFC, 0x50, 0xFF, 0xF2, 0x00, 0x00, 0x52, 0xFF, 0xE7, 0x0E, 0xFC, 256 | 0xFF, 0x26, 0x00, 0x96, 0xFF, 0xA7, 0x00, 0x9F, 0xFF, 0xE3, 0xB4, 0xFF, 0xFF, 0x3F, 0x00, 0x0E, 257 | 0xAE, 0xFF, 0xFF, 0xF2, 0x68, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 258 | 0x19, 0xA3, 0xAE, 0x2A, 0x00, 0x3F, 0xE9, 0xFF, 0xFF, 0x3D, 0x6E, 0xFC, 0xEE, 0xFF, 0xFF, 0x3D, 259 | 0xB4, 0xE1, 0x2E, 0xFF, 0xFF, 0x3D, 0x11, 0x15, 0x06, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x06, 0xFF, 260 | 0xFF, 0x3D, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 261 | 0x06, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x3D, 262 | 0x00, 0x17, 0x85, 0xBF, 0xE1, 0xAC, 0x41, 0x00, 0x00, 0x28, 0xE9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 263 | 0x4A, 0x00, 0x00, 0xB4, 0x99, 0x1F, 0x06, 0xBB, 0xFF, 0xAC, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 264 | 0x72, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x00, 265 | 0x00, 0x8E, 0xFF, 0xDA, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xE5, 0x1D, 0x00, 0x00, 0x00, 266 | 0x00, 0x7B, 0xFF, 0xDF, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x77, 0xFF, 0xD2, 0x15, 0x00, 0x00, 0x00, 267 | 0x00, 0x4A, 0xFF, 0xFF, 0xF6, 0xF2, 0xF2, 0xF2, 0xF2, 0x06, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 268 | 0xFF, 0xFF, 0x06, 0x00, 0x4E, 0xA7, 0xD2, 0xD6, 0xAC, 0x4A, 0x00, 0x2E, 0xFC, 0xFF, 0xFC, 0xFC, 269 | 0xFF, 0xFF, 0x50, 0x00, 0x66, 0x46, 0x02, 0x06, 0xC7, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 270 | 0xA1, 0xFF, 0x8A, 0x00, 0x00, 0x3D, 0x59, 0x8A, 0xFA, 0xCE, 0x13, 0x00, 0x00, 0xB4, 0xFF, 0xFF, 271 | 0xE1, 0x41, 0x00, 0x00, 0x00, 0x3D, 0x59, 0x7D, 0xE9, 0xFF, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 272 | 0x6A, 0xFF, 0xF4, 0x19, 0x02, 0x00, 0x00, 0x00, 0x8E, 0xFF, 0xE9, 0x5D, 0xF6, 0xAE, 0xA7, 0xC3, 273 | 0xFF, 0xFF, 0x81, 0x3D, 0xDD, 0xFF, 0xFF, 0xFF, 0xE7, 0x7B, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x0A, 274 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xAE, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 275 | 0xD2, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 276 | 0x35, 0xFF, 0x8C, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x08, 0xD8, 0xDF, 0x1D, 0xFF, 0xFF, 0x00, 0x00, 277 | 0x00, 0x90, 0xFF, 0x3F, 0x3B, 0xFF, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x94, 0x00, 0x3D, 0xFF, 0xFF, 278 | 0x00, 0x00, 0xB2, 0xFF, 0xFA, 0xF8, 0xFA, 0xFF, 0xFF, 0xF8, 0x4E, 0x7F, 0xB4, 0xB4, 0xB4, 0xC5, 279 | 0xFF, 0xFF, 0xB4, 0x39, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 280 | 0x00, 0x3D, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x74, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x0C, 0x00, 0xB2, 281 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x13, 0x00, 0xC3, 0xFF, 0x7B, 0x44, 0x44, 0x44, 0x06, 0x00, 0xEE, 282 | 0xFF, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xB6, 0xDD, 0xAC, 0x48, 0x00, 0x00, 0xF4, 283 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x52, 0x00, 0x13, 0x0C, 0x00, 0x1D, 0xC9, 0xFF, 0xBD, 0x00, 0x00, 284 | 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xEB, 0x17, 0x11, 0x00, 0x00, 0x00, 0x9B, 0xFF, 0xBB, 0x4A, 0xFC, 285 | 0xC3, 0xAC, 0xCE, 0xFF, 0xFF, 0x50, 0x2E, 0xD8, 0xFF, 0xFF, 0xFF, 0xE1, 0x5B, 0x00, 0x00, 0x00, 286 | 0x06, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x68, 0xAC, 0xB8, 0xB8, 0x39, 0x00, 0x00, 287 | 0x11, 0xCC, 0xFF, 0xFF, 0xFA, 0xF8, 0x50, 0x00, 0x00, 0x9F, 0xFF, 0xB4, 0x1D, 0x00, 0x00, 0x02, 288 | 0x00, 0x0E, 0xFC, 0xF2, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0xAA, 0x7D, 0xE9, 0xF0, 289 | 0x94, 0x0C, 0x00, 0x5D, 0xFF, 0xF2, 0xF8, 0xBD, 0xFC, 0xFF, 0x9F, 0x00, 0x63, 0xFF, 0xF4, 0x1B, 290 | 0x00, 0x57, 0xFF, 0xF8, 0x00, 0x5B, 0xFF, 0xBF, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x06, 0x2A, 0xFF, 291 | 0xFA, 0x1D, 0x00, 0x52, 0xFF, 0xF6, 0x00, 0x00, 0xAC, 0xFF, 0xE5, 0xAA, 0xF4, 0xFF, 0x8C, 0x00, 292 | 0x00, 0x0C, 0xA1, 0xFC, 0xFF, 0xFC, 0x96, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0C, 0x02, 0x00, 293 | 0x00, 0x00, 0x6A, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x04, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 294 | 0xFF, 0xFF, 0xFF, 0x04, 0x24, 0x3D, 0x3D, 0x3D, 0x3D, 0x9D, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0x00, 295 | 0x00, 0x02, 0xE1, 0xFF, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0xD8, 0x00, 0x00, 0x00, 296 | 0x00, 0x00, 0x00, 0xCE, 0xFF, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xEE, 0x08, 0x00, 297 | 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xFF, 0xFC, 0x1F, 298 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xFF, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFC, 0xFF, 299 | 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x7F, 0xB4, 0xD4, 0xAC, 0x46, 0x00, 0x00, 0xC1, 0xFF, 300 | 0xF6, 0xD0, 0xFF, 0xFF, 0x52, 0x0A, 0xFF, 0xFC, 0x17, 0x00, 0x85, 0xFF, 0xA5, 0x04, 0xFA, 0xFF, 301 | 0x2C, 0x00, 0x96, 0xFF, 0x90, 0x00, 0x6E, 0xFF, 0xF2, 0xBF, 0xFF, 0xD4, 0x17, 0x00, 0x08, 0xC5, 302 | 0xFF, 0xFF, 0xFA, 0x39, 0x00, 0x04, 0xC7, 0xFF, 0xBD, 0x7F, 0xFC, 0xFC, 0x52, 0x55, 0xFF, 0xC5, 303 | 0x00, 0x00, 0x4A, 0xFF, 0xE9, 0x61, 0xFF, 0xB0, 0x00, 0x00, 0x1B, 0xFF, 0xFC, 0x2C, 0xFF, 0xFF, 304 | 0xA7, 0x96, 0xD6, 0xFF, 0xB2, 0x00, 0x55, 0xE1, 0xFF, 0xFF, 0xFC, 0x9F, 0x11, 0x00, 0x00, 0x00, 305 | 0x0A, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x7F, 0xB4, 0xB6, 0x90, 0x19, 0x00, 0x00, 0xC3, 0xFF, 306 | 0xFF, 0xFF, 0xFF, 0xE9, 0x19, 0x4A, 0xFF, 0xF0, 0x28, 0x08, 0xB6, 0xFF, 0x99, 0x79, 0xFF, 0xAA, 307 | 0x00, 0x00, 0x4C, 0xFF, 0xEE, 0x6A, 0xFF, 0xBF, 0x00, 0x00, 0x55, 0xFF, 0xFF, 0x37, 0xFF, 0xFF, 308 | 0x96, 0x7D, 0xE9, 0xFF, 0xFF, 0x00, 0x83, 0xFF, 0xFF, 0xFF, 0x7B, 0xFF, 0xF2, 0x00, 0x00, 0x1B, 309 | 0x4A, 0x22, 0x4C, 0xFF, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x11, 0xCC, 0xFF, 0x5B, 0x00, 0x79, 0xA1, 310 | 0xAA, 0xF2, 0xFF, 0xBB, 0x00, 0x00, 0xB4, 0xFF, 0xFF, 0xE9, 0x81, 0x06, 0x00, 0x00, 0x06, 0x0C, 311 | 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x41, 0x00, 0x06, 0xFA, 0xFF, 0x4E, 0x04, 0xE9, 0xFF, 312 | 0x3B, 0x00, 0x04, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x39, 313 | 0x00, 0x06, 0xF6, 0xFF, 0x4C, 0x06, 0xEE, 0xFF, 0x3F, 0x00, 0x04, 0x17, 0x00, 0x00, 0x2E, 0x41, 314 | 0x00, 0x06, 0xFA, 0xFF, 0x4E, 0x04, 0xE9, 0xFF, 0x3B, 0x00, 0x04, 0x0A, 0x00, 0x00, 0x00, 0x00, 315 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0xAE, 0x33, 0x02, 0xFC, 0xFA, 316 | 0x06, 0x39, 0xFF, 0xA1, 0x00, 0x5F, 0xF2, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 317 | 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xA7, 0xF2, 0x00, 0x00, 0x00, 0x28, 0xA7, 0xFF, 0xF4, 318 | 0x85, 0x00, 0x28, 0xAA, 0xFF, 0xE9, 0x7B, 0x0E, 0x00, 0x48, 0xFF, 0xFF, 0x79, 0x06, 0x00, 0x00, 319 | 0x00, 0x1F, 0xAA, 0xFC, 0xFA, 0x9B, 0x35, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x8C, 0xF4, 0xFF, 0xCE, 320 | 0x61, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x72, 0xDD, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 321 | 0x46, 0x33, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x8C, 0x57, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 322 | 0xF2, 0x02, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x39, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 323 | 0x9F, 0x52, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xF2, 0xE5, 0x19, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 324 | 0x00, 0x57, 0xE3, 0x72, 0x06, 0x00, 0x00, 0x00, 0x00, 0x24, 0xC3, 0xFF, 0xE5, 0x72, 0x06, 0x00, 325 | 0x00, 0x00, 0x00, 0x35, 0xB0, 0xFF, 0xE7, 0x72, 0x06, 0x00, 0x00, 0x00, 0x00, 0x28, 0xC7, 0xFF, 326 | 0xDF, 0x00, 0x00, 0x06, 0x66, 0xCE, 0xFF, 0xE3, 0x77, 0x1B, 0x8E, 0xF2, 0xFF, 0xCE, 0x5D, 0x02, 327 | 0x00, 0x57, 0xFF, 0xAE, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 328 | 0x00, 0x26, 0x88, 0xB8, 0xE5, 0xB4, 0x5F, 0x00, 0xB8, 0xFF, 0xFC, 0xF8, 0xFF, 0xFF, 0x6A, 0x33, 329 | 0x5D, 0x04, 0x00, 0x77, 0xFF, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x79, 0xFF, 0xAC, 0x00, 0x00, 0x00, 330 | 0x74, 0xFF, 0xF2, 0x2E, 0x00, 0x00, 0x7B, 0xFF, 0xDD, 0x2C, 0x00, 0x00, 0x00, 0xEE, 0xFC, 0x15, 331 | 0x00, 0x00, 0x00, 0x00, 0x5B, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x33, 0x00, 0x00, 0x00, 332 | 0x00, 0x22, 0xFF, 0xFF, 0x3B, 0x00, 0x00, 0x00, 0x1B, 0xF6, 0xFC, 0x33, 0x00, 0x00, 0x00, 0x00, 333 | 0x0C, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x7F, 0xA5, 0xA7, 0x94, 0x44, 0x00, 334 | 0x00, 0x00, 0x00, 0x00, 0x0C, 0xA5, 0xFF, 0xE5, 0xB0, 0xAA, 0xD8, 0xFF, 0xBD, 0x15, 0x00, 0x00, 335 | 0x02, 0xC3, 0xF2, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x52, 0xF4, 0xC3, 0x00, 0x00, 0x72, 0xFF, 0x4A, 336 | 0x15, 0x96, 0xE5, 0xEE, 0xBD, 0x6A, 0x6E, 0xFF, 0x4C, 0x00, 0xE3, 0xBF, 0x02, 0xD4, 0xF2, 0x7D, 337 | 0x5F, 0xFF, 0xA3, 0x04, 0xFC, 0x9F, 0x1B, 0xFF, 0x74, 0x55, 0xFF, 0x66, 0x00, 0x06, 0xFF, 0x9D, 338 | 0x00, 0xF2, 0xA7, 0x48, 0xFF, 0x57, 0x63, 0xFF, 0x44, 0x00, 0x22, 0xFF, 0x96, 0x00, 0xF8, 0xA1, 339 | 0x39, 0xFF, 0x5F, 0x55, 0xFF, 0x6C, 0x00, 0x7B, 0xFF, 0x9D, 0x35, 0xFF, 0x5B, 0x04, 0xFA, 0xA7, 340 | 0x02, 0xC3, 0xFF, 0xF2, 0xF8, 0xBB, 0xFF, 0xFA, 0xC5, 0x02, 0x00, 0x9D, 0xFC, 0x39, 0x02, 0x4C, 341 | 0x5B, 0x24, 0x00, 0x52, 0x55, 0x06, 0x00, 0x00, 0x15, 0xDD, 0xF6, 0x81, 0x44, 0x0E, 0x37, 0x52, 342 | 0x9D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x11, 0x92, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x08, 0x00, 343 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x30, 0x4A, 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 344 | 0x00, 0x3D, 0xB4, 0xB4, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xFF, 0xFA, 0xF8, 345 | 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xF6, 0xFA, 0xAA, 0xFF, 0x57, 0x00, 0x00, 0x00, 0x00, 346 | 0x00, 0x59, 0xFF, 0xB2, 0x57, 0xFF, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0x68, 0x0C, 347 | 0xFC, 0xFA, 0x11, 0x00, 0x00, 0x00, 0x0E, 0xFC, 0xFF, 0x1B, 0x00, 0xB8, 0xFF, 0x66, 0x00, 0x00, 348 | 0x00, 0x66, 0xFF, 0xE9, 0x63, 0x63, 0xAC, 0xFF, 0xBF, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 349 | 0xFF, 0xFF, 0xFF, 0xFF, 0x1B, 0x00, 0x1D, 0xFF, 0xFF, 0x74, 0x63, 0x63, 0x63, 0xDA, 0xFF, 0x72, 350 | 0x00, 0x74, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xFF, 0xCE, 0x00, 0xD0, 0xFF, 0x92, 0x00, 351 | 0x00, 0x00, 0x00, 0x3B, 0xFF, 0xFF, 0x26, 0x72, 0xAE, 0xAE, 0xAC, 0xA5, 0x90, 0x3F, 0x00, 0x00, 352 | 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8A, 0x00, 0xA7, 0xFF, 0xA7, 0x13, 0x3B, 0xAC, 0xFF, 353 | 0xF8, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x55, 0xFF, 0xF8, 0x00, 0xA7, 0xFF, 0xC5, 0x63, 0x81, 354 | 0xDD, 0xFF, 0x8E, 0x00, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x22, 0x00, 0xA7, 0xFF, 0xBF, 355 | 0x50, 0x55, 0xB0, 0xFF, 0xE9, 0x06, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0x48, 0xA7, 356 | 0xFF, 0xA1, 0x00, 0x00, 0x50, 0xFF, 0xFF, 0x37, 0xA7, 0xFF, 0xF8, 0xEB, 0xEE, 0xFF, 0xFF, 0xC9, 357 | 0x00, 0xA7, 0xFF, 0xFF, 0xFF, 0xFC, 0xE5, 0x90, 0x11, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xD6, 358 | 0xC9, 0xA3, 0x4A, 0x00, 0x00, 0x94, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x00, 0x59, 0xFF, 0xFF, 359 | 0x70, 0x06, 0x0C, 0x61, 0x48, 0x00, 0xC7, 0xFF, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFC, 360 | 0xFF, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 361 | 0x06, 0xFF, 0xFF, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x72, 0x00, 0x00, 0x00, 362 | 0x00, 0x00, 0x00, 0x96, 0xFF, 0xE3, 0x19, 0x00, 0x00, 0x02, 0x24, 0x00, 0x1B, 0xE9, 0xFF, 0xFA, 363 | 0xB6, 0xB6, 0xF6, 0xA1, 0x00, 0x00, 0x24, 0xBB, 0xFC, 0xFF, 0xFF, 0xF2, 0x6C, 0x00, 0x00, 0x00, 364 | 0x00, 0x02, 0x0C, 0x0A, 0x00, 0x00, 0x72, 0xAE, 0xAE, 0xAC, 0xA5, 0x79, 0x24, 0x00, 0x00, 0x00, 365 | 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0xA7, 0xFF, 0xA7, 0x13, 0x39, 0x85, 366 | 0xFF, 0xFF, 0x6A, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x8A, 0xFF, 0xE5, 0x00, 0xA7, 0xFF, 367 | 0xA1, 0x00, 0x00, 0x00, 0x3B, 0xFF, 0xFF, 0x22, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x0C, 0xFF, 368 | 0xFF, 0x44, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0x2A, 0xA7, 0xFF, 0xA1, 0x00, 369 | 0x00, 0x00, 0x77, 0xFF, 0xF4, 0x02, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x52, 0xF2, 0xFF, 0x88, 0x00, 370 | 0xA7, 0xFF, 0xF8, 0xEB, 0xF8, 0xFF, 0xFF, 0xBB, 0x08, 0x00, 0xA7, 0xFF, 0xFF, 0xFC, 0xF2, 0xB6, 371 | 0x5F, 0x00, 0x00, 0x00, 0x72, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x66, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 372 | 0xFF, 0x94, 0xA7, 0xFF, 0xA7, 0x13, 0x13, 0x13, 0x0C, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 373 | 0xA7, 0xFF, 0xD8, 0x94, 0x94, 0x94, 0x2A, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4A, 0xA7, 0xFF, 374 | 0xC1, 0x57, 0x57, 0x57, 0x19, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 375 | 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xF8, 0xEB, 0xEB, 0xEB, 0x88, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 376 | 0x94, 0x72, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x44, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x63, 0xA7, 377 | 0xFF, 0xA1, 0x13, 0x13, 0x13, 0x06, 0xA7, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0x9D, 378 | 0x06, 0x06, 0x06, 0x02, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x44, 0xA7, 0xFF, 0xE1, 0xB4, 0xB4, 379 | 0xB4, 0x30, 0xA7, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, 380 | 0xA7, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 381 | 0x00, 0x30, 0x99, 0xBD, 0xE5, 0xB6, 0x94, 0x33, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 382 | 0xFF, 0x55, 0x00, 0x52, 0xFF, 0xFF, 0xA7, 0x24, 0x00, 0x1B, 0x6A, 0x02, 0x00, 0xC7, 0xFF, 0xC3, 383 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFC, 0xFF, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 384 | 0x0C, 0xFF, 0xFF, 0x44, 0x00, 0x9B, 0xFF, 0xFF, 0xFF, 0xA7, 0x06, 0xFF, 0xFF, 0x48, 0x00, 0x8E, 385 | 0xEB, 0xF8, 0xFF, 0xA7, 0x00, 0xEB, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x9B, 0xFF, 0xA7, 0x00, 0x94, 386 | 0xFF, 0xEB, 0x2A, 0x00, 0x00, 0x9B, 0xFF, 0xA7, 0x00, 0x17, 0xE5, 0xFF, 0xFC, 0xBB, 0xB2, 0xF2, 387 | 0xFF, 0xA7, 0x00, 0x00, 0x1D, 0xAA, 0xFC, 0xFF, 0xFF, 0xFF, 0xD6, 0x6A, 0x00, 0x00, 0x00, 0x00, 388 | 0x02, 0x0C, 0x0C, 0x02, 0x00, 0x00, 0x72, 0xAE, 0x6E, 0x00, 0x00, 0x00, 0x08, 0xAE, 0xAE, 0x08, 389 | 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 390 | 0x0C, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 391 | 0xD8, 0x94, 0x94, 0x94, 0x99, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 392 | 0xFF, 0x0C, 0xA7, 0xFF, 0xC1, 0x57, 0x57, 0x57, 0x5F, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 0xA1, 0x00, 393 | 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x0C, 394 | 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x0C, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 395 | 0x0C, 0xFF, 0xFF, 0x0C, 0x66, 0xAE, 0xAE, 0xAE, 0xAE, 0x3B, 0x61, 0xF8, 0xFF, 0xFF, 0xE9, 0x39, 396 | 0x00, 0x48, 0xFF, 0xFF, 0x06, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 397 | 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x44, 398 | 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x00, 0x00, 0x35, 0xC3, 0xFF, 0xFF, 0xAA, 0x1D, 399 | 0x94, 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x00, 0x00, 0x00, 0x72, 0xAE, 0x6E, 0x00, 0x00, 0x00, 0xA7, 400 | 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 401 | 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 402 | 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 403 | 0xFF, 0xA1, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0x9D, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0x7D, 0x0C, 0xBF, 404 | 0xD6, 0xFF, 0xFF, 0x2C, 0x0C, 0xFF, 0xFF, 0xEB, 0x5F, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 405 | 0x72, 0xAE, 0x6E, 0x00, 0x00, 0x00, 0x94, 0xAE, 0x6E, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x85, 0xFF, 406 | 0xE3, 0x15, 0xA7, 0xFF, 0xA1, 0x00, 0x50, 0xFF, 0xF8, 0x33, 0x00, 0xA7, 0xFF, 0xA1, 0x28, 0xF2, 407 | 0xFF, 0x5F, 0x00, 0x00, 0xA7, 0xFF, 0xAA, 0xD6, 0xFF, 0x96, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xFC, 408 | 0xFF, 0xFF, 0x77, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xFF, 0xB6, 0xFF, 0xF8, 0x22, 0x00, 0x00, 0xA7, 409 | 0xFF, 0xA1, 0x00, 0xC5, 0xFF, 0xBB, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x2A, 0xFC, 0xFF, 0x59, 410 | 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x85, 0xFF, 0xE9, 0x13, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x08, 411 | 0xDF, 0xFF, 0x9B, 0x72, 0xAE, 0x6E, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 412 | 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA7, 413 | 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 414 | 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 415 | 0x00, 0x00, 0xA7, 0xFF, 0xF8, 0xEB, 0xEB, 0xEB, 0xE5, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 416 | 0x72, 0xAE, 0xAE, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x41, 0xAE, 0xAE, 0x7B, 0xA7, 0xFF, 0xFF, 0xCC, 417 | 0x00, 0x00, 0x00, 0x00, 0xAE, 0xFF, 0xFF, 0xB4, 0xA7, 0xFF, 0xF6, 0xFF, 0x1B, 0x00, 0x00, 0x04, 418 | 0xFA, 0xF6, 0xFF, 0xB4, 0xA7, 0xFF, 0xB2, 0xFF, 0x68, 0x00, 0x00, 0x57, 0xFF, 0xB2, 0xFF, 0xB4, 419 | 0xA7, 0xFF, 0x6A, 0xFF, 0xB6, 0x00, 0x00, 0xA7, 0xFC, 0x63, 0xFF, 0xB4, 0xA7, 0xFF, 0x57, 0xCC, 420 | 0xFA, 0x08, 0x04, 0xFA, 0xC1, 0x50, 0xFF, 0xB4, 0xA7, 0xFF, 0x57, 0x7F, 0xFF, 0x57, 0x52, 0xFF, 421 | 0x6A, 0x50, 0xFF, 0xB4, 0xA7, 0xFF, 0x57, 0x2C, 0xFF, 0xA7, 0xA5, 0xFF, 0x1B, 0x50, 0xFF, 0xB4, 422 | 0xA7, 0xFF, 0x57, 0x00, 0xDF, 0xF6, 0xF6, 0xC3, 0x00, 0x50, 0xFF, 0xB4, 0xA7, 0xFF, 0x57, 0x00, 423 | 0x90, 0xFF, 0xFF, 0x72, 0x00, 0x50, 0xFF, 0xB4, 0xA7, 0xFF, 0x57, 0x00, 0x41, 0xFF, 0xFF, 0x1D, 424 | 0x00, 0x50, 0xFF, 0xB4, 0x72, 0xAE, 0xAE, 0x48, 0x00, 0x00, 0x00, 0x2A, 0xAE, 0x9D, 0xA7, 0xFF, 425 | 0xFF, 0xDD, 0x06, 0x00, 0x00, 0x3D, 0xFF, 0xE5, 0xA7, 0xFF, 0xFF, 0xFF, 0x77, 0x00, 0x00, 0x3D, 426 | 0xFF, 0xE5, 0xA7, 0xFF, 0xA1, 0xFF, 0xF4, 0x19, 0x00, 0x3D, 0xFF, 0xE5, 0xA7, 0xFF, 0x4C, 0xC3, 427 | 0xFF, 0x9F, 0x00, 0x3D, 0xFF, 0xE5, 0xA7, 0xFF, 0x52, 0x30, 0xFF, 0xFF, 0x33, 0x3D, 0xFF, 0xE5, 428 | 0xA7, 0xFF, 0x57, 0x00, 0x99, 0xFF, 0xCE, 0x1D, 0xFF, 0xE5, 0xA7, 0xFF, 0x57, 0x00, 0x15, 0xF2, 429 | 0xFF, 0x6A, 0xFF, 0xE5, 0xA7, 0xFF, 0x57, 0x00, 0x00, 0x77, 0xFF, 0xEB, 0xFF, 0xE5, 0xA7, 0xFF, 430 | 0x57, 0x00, 0x00, 0x02, 0xDA, 0xFF, 0xFF, 0xE5, 0xA7, 0xFF, 0x57, 0x00, 0x00, 0x00, 0x4C, 0xFF, 431 | 0xFF, 0xE5, 0x00, 0x00, 0x00, 0x5F, 0xAC, 0xE3, 0xE1, 0xAC, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 432 | 0xB6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x00, 0x00, 0x00, 0x72, 0xFF, 0xFF, 0x6A, 0x04, 433 | 0x04, 0x72, 0xFF, 0xFF, 0x5D, 0x00, 0x00, 0xD6, 0xFF, 0x9D, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 434 | 0xC1, 0x00, 0x02, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xF8, 0x00, 0x0C, 0xFF, 435 | 0xFF, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0xFF, 0x02, 0x06, 0xFF, 0xFF, 0x4C, 0x00, 0x00, 436 | 0x00, 0x00, 0x57, 0xFF, 0xFC, 0x00, 0x00, 0xE9, 0xFF, 0x83, 0x00, 0x00, 0x00, 0x00, 0x90, 0xFF, 437 | 0xD4, 0x00, 0x00, 0x8C, 0xFF, 0xEE, 0x28, 0x00, 0x00, 0x2C, 0xF2, 0xFF, 0x7D, 0x00, 0x00, 0x11, 438 | 0xDF, 0xFF, 0xFC, 0xBF, 0xC3, 0xFC, 0xFF, 0xD6, 0x0C, 0x00, 0x00, 0x00, 0x15, 0xA1, 0xFA, 0xFF, 439 | 0xFF, 0xFA, 0x96, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0C, 0x0A, 0x00, 0x00, 0x00, 440 | 0x00, 0x00, 0x72, 0xAE, 0xAE, 0xAC, 0xA5, 0x7B, 0x15, 0x00, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 441 | 0xE9, 0x1D, 0xA7, 0xFF, 0xA7, 0x13, 0x50, 0xE7, 0xFF, 0x90, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x9D, 442 | 0xFF, 0xAE, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0xC3, 0xFF, 0xA5, 0xA7, 0xFF, 0xDF, 0xAA, 0xDA, 0xFF, 443 | 0xFF, 0x3F, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x5D, 0x00, 0xA7, 0xFF, 0xB8, 0x3B, 0x0C, 0x00, 444 | 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 445 | 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xAC, 0xE3, 446 | 0xE1, 0xAC, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 447 | 0x00, 0x00, 0x00, 0x72, 0xFF, 0xFF, 0x6A, 0x04, 0x04, 0x72, 0xFF, 0xFF, 0x5D, 0x00, 0x00, 0xD6, 448 | 0xFF, 0x9D, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0xC1, 0x00, 0x02, 0xFF, 0xFF, 0x50, 0x00, 0x00, 449 | 0x00, 0x00, 0x5D, 0xFF, 0xF8, 0x00, 0x0C, 0xFF, 0xFF, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 450 | 0xFF, 0x02, 0x06, 0xFF, 0xFF, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x57, 0xFF, 0xFC, 0x00, 0x00, 0xE9, 451 | 0xFF, 0x83, 0x00, 0x00, 0x00, 0x00, 0x90, 0xFF, 0xD4, 0x00, 0x00, 0x8C, 0xFF, 0xEE, 0x28, 0x00, 452 | 0x00, 0x2C, 0xF2, 0xFF, 0x81, 0x00, 0x00, 0x11, 0xDF, 0xFF, 0xFC, 0xBF, 0xC3, 0xFC, 0xFF, 0xD8, 453 | 0x0E, 0x00, 0x00, 0x00, 0x15, 0xA1, 0xFA, 0xFF, 0xFF, 0xFF, 0xC5, 0x15, 0x00, 0x00, 0x00, 0x00, 454 | 0x00, 0x00, 0x02, 0x0C, 0x8E, 0xFF, 0xF4, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 455 | 0x00, 0xBB, 0xFF, 0xE9, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x92, 0x94, 456 | 0x77, 0x00, 0x72, 0xAE, 0xAE, 0xAA, 0xA5, 0x70, 0x17, 0x00, 0x00, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 457 | 0xFF, 0xEB, 0x26, 0x00, 0xA7, 0xFF, 0xA7, 0x1F, 0x4E, 0xE3, 0xFF, 0x9D, 0x00, 0xA7, 0xFF, 0xA1, 458 | 0x00, 0x00, 0x9B, 0xFF, 0xB0, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x1B, 0xD4, 0xFF, 0x8C, 0x00, 0xA7, 459 | 0xFF, 0xFC, 0xF8, 0xFF, 0xFF, 0xD0, 0x13, 0x00, 0xA7, 0xFF, 0xF8, 0xEE, 0xFF, 0xEE, 0x08, 0x00, 460 | 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0xC5, 0xFF, 0x85, 0x00, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x2A, 0xFC, 461 | 0xFC, 0x33, 0x00, 0xA7, 0xFF, 0xA1, 0x00, 0x00, 0x85, 0xFF, 0xD6, 0x06, 0xA7, 0xFF, 0xA1, 0x00, 462 | 0x00, 0x08, 0xDF, 0xFF, 0x8C, 0x00, 0x04, 0x79, 0xBB, 0xE5, 0xB6, 0x81, 0x24, 0x00, 0xAC, 0xFF, 463 | 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0x11, 0xFF, 0xFF, 0x48, 0x02, 0x2A, 0x7B, 0x02, 0x28, 0xFF, 0xFF, 464 | 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xFF, 0xEB, 0x72, 0x08, 0x00, 0x00, 0x00, 0x2A, 0xDD, 465 | 0xFF, 0xFF, 0xE7, 0x4E, 0x00, 0x00, 0x00, 0x06, 0x70, 0xE5, 0xFF, 0xFF, 0x3B, 0x00, 0x00, 0x00, 466 | 0x00, 0x0C, 0xC9, 0xFF, 0xA1, 0x2C, 0x44, 0x00, 0x00, 0x00, 0xAC, 0xFF, 0xA1, 0x50, 0xFF, 0xEE, 467 | 0xB0, 0xC3, 0xFF, 0xFF, 0x46, 0x2E, 0xCE, 0xFF, 0xFF, 0xFF, 0xE3, 0x5D, 0x00, 0x00, 0x00, 0x02, 468 | 0x0C, 0x0A, 0x00, 0x00, 0x00, 0x77, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x3B, 0xAE, 0xFF, 469 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x2A, 0x3D, 0x3D, 0xC5, 0xFF, 0x88, 0x3D, 0x3D, 0x15, 470 | 0x00, 0x00, 0x00, 0xB4, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0x63, 0x00, 471 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xFF, 472 | 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 473 | 0xB4, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 474 | 0x00, 0x00, 0xB4, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x77, 0xAE, 0x66, 0x00, 0x00, 0x00, 0x2E, 0xAE, 475 | 0xAE, 0x04, 0xAE, 0xFF, 0x94, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x06, 0xAE, 0xFF, 0x94, 0x00, 476 | 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x06, 0xAE, 0xFF, 0x94, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x06, 477 | 0xAE, 0xFF, 0x94, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x06, 0xAE, 0xFF, 0x94, 0x00, 0x00, 0x00, 478 | 0x44, 0xFF, 0xFF, 0x06, 0xAE, 0xFF, 0x94, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0x06, 0xAC, 0xFF, 479 | 0x9B, 0x00, 0x00, 0x00, 0x4A, 0xFF, 0xFF, 0x02, 0x83, 0xFF, 0xDF, 0x11, 0x00, 0x00, 0x9B, 0xFF, 480 | 0xDA, 0x00, 0x19, 0xEE, 0xFF, 0xF6, 0xB4, 0xDA, 0xFF, 0xFF, 0x59, 0x00, 0x00, 0x2A, 0xC3, 0xFF, 481 | 0xFF, 0xFF, 0xDA, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 482 | 0x96, 0xAE, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x72, 0xAE, 0x6E, 0x92, 0xFF, 0xA7, 0x00, 0x00, 0x00, 483 | 0x00, 0xE7, 0xFF, 0x52, 0x3D, 0xFF, 0xF6, 0x02, 0x00, 0x00, 0x3B, 0xFF, 0xF8, 0x04, 0x00, 0xE3, 484 | 0xFF, 0x4C, 0x00, 0x00, 0x8C, 0xFF, 0xA3, 0x00, 0x00, 0x8E, 0xFF, 0x9D, 0x00, 0x00, 0xDA, 0xFF, 485 | 0x4E, 0x00, 0x00, 0x39, 0xFF, 0xE9, 0x00, 0x2C, 0xFF, 0xF2, 0x02, 0x00, 0x00, 0x00, 0xE1, 0xFF, 486 | 0x3D, 0x7F, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xFF, 0x83, 0xC3, 0xFF, 0x48, 0x00, 0x00, 487 | 0x00, 0x00, 0x35, 0xFF, 0xC1, 0xFC, 0xEE, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xFF, 0xFF, 488 | 0x9B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xFF, 0xFF, 0x41, 0x00, 0x00, 0x00, 0xA1, 0xAE, 489 | 0x37, 0x00, 0x00, 0x00, 0x9F, 0xAE, 0x3F, 0x00, 0x00, 0x00, 0x8A, 0xAE, 0x3F, 0xAC, 0xFF, 0x7F, 490 | 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xA1, 0x00, 0x00, 0x02, 0xFA, 0xFF, 0x2E, 0x6A, 0xFF, 0xB4, 0x00, 491 | 0x00, 0x57, 0xFF, 0xFF, 0xE3, 0x00, 0x00, 0x3F, 0xFF, 0xF2, 0x00, 0x28, 0xFF, 0xF6, 0x00, 0x00, 492 | 0xA5, 0xFF, 0xC7, 0xFF, 0x24, 0x00, 0x74, 0xFF, 0xA7, 0x00, 0x00, 0xEB, 0xFF, 0x35, 0x00, 0xE7, 493 | 0xF4, 0x6A, 0xFF, 0x66, 0x00, 0xAC, 0xFF, 0x68, 0x00, 0x00, 0xA7, 0xFF, 0x6A, 0x26, 0xFF, 0xAC, 494 | 0x3B, 0xFF, 0xA7, 0x00, 0xF4, 0xFF, 0x2A, 0x00, 0x00, 0x63, 0xFF, 0xA7, 0x63, 0xFF, 0x70, 0x02, 495 | 0xF6, 0xEE, 0x28, 0xFF, 0xEB, 0x00, 0x00, 0x00, 0x26, 0xFF, 0xE3, 0xA3, 0xFF, 0x33, 0x00, 0xAE, 496 | 0xFF, 0x79, 0xFF, 0xA7, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xFF, 0xCE, 0xF6, 0x00, 0x00, 0x6E, 0xFF, 497 | 0xE5, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0xA5, 0xFF, 0xFF, 0xAA, 0x00, 0x00, 0x30, 0xFF, 0xFF, 498 | 0xFF, 0x28, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xFF, 0x68, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xE7, 499 | 0x00, 0x00, 0x00, 0x5B, 0xAE, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x99, 0xAE, 0x59, 0x13, 0xE9, 0xFF, 500 | 0x72, 0x00, 0x00, 0x61, 0xFF, 0xE7, 0x0E, 0x00, 0x57, 0xFF, 0xF0, 0x17, 0x0C, 0xE7, 0xFF, 0x52, 501 | 0x00, 0x00, 0x00, 0xB2, 0xFF, 0xA5, 0x8A, 0xFF, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xF2, 0xFF, 502 | 0xFF, 0xF4, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0xFF, 0xFF, 0x85, 0x00, 0x00, 0x00, 0x00, 503 | 0x00, 0x1D, 0xF2, 0xFF, 0xFF, 0xE7, 0x13, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x90, 0xBD, 0xFF, 504 | 0xA5, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xE5, 0x0C, 0x22, 0xF8, 0xFF, 0x50, 0x00, 0x15, 0xEB, 0xFF, 505 | 0x57, 0x00, 0x00, 0x7F, 0xFF, 0xE9, 0x13, 0xA7, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0x06, 0xDD, 0xFF, 506 | 0xA5, 0x8A, 0xAE, 0x6A, 0x00, 0x00, 0x00, 0x2A, 0xAE, 0xAE, 0x19, 0x55, 0xFF, 0xF6, 0x15, 0x00, 507 | 0x00, 0xAC, 0xFF, 0xB0, 0x00, 0x00, 0xCE, 0xFF, 0x88, 0x00, 0x2C, 0xFF, 0xFC, 0x28, 0x00, 0x00, 508 | 0x3D, 0xFF, 0xF8, 0x19, 0xAE, 0xFF, 0x96, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0xB8, 0xFF, 0xF6, 509 | 0x19, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xFF, 0xFF, 0xFF, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 510 | 0xA1, 0xFF, 0xEB, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xBB, 0x00, 0x00, 0x00, 511 | 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 512 | 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x48, 513 | 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0x2A, 0x6A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 514 | 0x33, 0x1B, 0x3D, 0x3D, 0x3D, 0x3D, 0xDD, 0xFF, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFF, 515 | 0xE5, 0x13, 0x00, 0x00, 0x00, 0x00, 0x26, 0xF6, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0xCE, 516 | 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xFF, 0xD6, 0x08, 0x00, 0x00, 0x00, 0x00, 0x37, 517 | 0xFF, 0xFC, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xDD, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 518 | 0x88, 0xFF, 0xFF, 0xEB, 0xEB, 0xEB, 0xEB, 0xEB, 0x4A, 0xA1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 519 | 0xFF, 0x50, 0xAA, 0xAE, 0xAE, 0x6A, 0xF8, 0xFC, 0xBB, 0x72, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 520 | 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 521 | 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xFA, 522 | 0x3D, 0x24, 0xF8, 0xFF, 0xFF, 0x9B, 0x55, 0x57, 0x57, 0x35, 0x81, 0xAE, 0x26, 0x00, 0x00, 0x00, 523 | 0x70, 0xFF, 0x88, 0x00, 0x00, 0x00, 0x15, 0xFC, 0xE5, 0x00, 0x00, 0x00, 0x00, 0xB2, 0xFF, 0x46, 524 | 0x00, 0x00, 0x00, 0x52, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x02, 0xEE, 0xFA, 0x0C, 0x00, 0x00, 0x00, 525 | 0x92, 0xFF, 0x66, 0x00, 0x00, 0x00, 0x37, 0xFF, 0xC7, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xFF, 0x26, 526 | 0x00, 0x00, 0x00, 0x79, 0xFF, 0x85, 0x00, 0x00, 0x00, 0x19, 0xFC, 0xE3, 0x6E, 0xAE, 0xAE, 0xA5, 527 | 0x77, 0xBB, 0xFC, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 528 | 0x00, 0x00, 0xF8, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 529 | 0x00, 0x00, 0xF8, 0xF2, 0x00, 0x00, 0xF8, 0xF2, 0x26, 0x3D, 0xFA, 0xF2, 0xA1, 0xFF, 0xFF, 0xF2, 530 | 0x37, 0x57, 0x57, 0x52, 0x00, 0x00, 0x00, 0x6E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 531 | 0xF2, 0xFF, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0xFC, 0xDD, 0xC7, 0x00, 0x00, 0x00, 0x00, 532 | 0x04, 0xE5, 0xAA, 0x59, 0xFF, 0x48, 0x00, 0x00, 0x00, 0x68, 0xFF, 0x35, 0x00, 0xD8, 0xD2, 0x00, 533 | 0x00, 0x00, 0xD8, 0xC9, 0x00, 0x00, 0x59, 0xFF, 0x55, 0x00, 0x50, 0xFF, 0x5D, 0x00, 0x00, 0x00, 534 | 0xD8, 0xD8, 0x00, 0x28, 0x3D, 0x02, 0x00, 0x00, 0x00, 0x22, 0x3D, 0x0C, 0xA7, 0xA7, 0xA7, 0xA7, 535 | 0xA7, 0xA7, 0x28, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x15, 0x17, 0x63, 0x63, 0x1B, 0x00, 0x00, 536 | 0x72, 0xFF, 0xC7, 0x04, 0x00, 0x00, 0x41, 0xE1, 0x88, 0x00, 0x00, 0x08, 0x4A, 0x50, 0x4A, 0x04, 537 | 0x00, 0x00, 0x55, 0xFA, 0xFF, 0xFF, 0xFF, 0xE9, 0x39, 0x00, 0x15, 0xB8, 0x63, 0x50, 0xB6, 0xFF, 538 | 0xC3, 0x00, 0x00, 0x00, 0x00, 0x04, 0x50, 0xFF, 0xF2, 0x00, 0x4A, 0xC3, 0xFA, 0xFF, 0xFF, 0xFF, 539 | 0xF2, 0x26, 0xFF, 0xFF, 0x8A, 0x4A, 0x7B, 0xFF, 0xF2, 0x57, 0xFF, 0xF6, 0x00, 0x00, 0x68, 0xFF, 540 | 0xF2, 0x3B, 0xFF, 0xFF, 0x9B, 0x90, 0xF2, 0xFF, 0xF2, 0x00, 0x92, 0xFF, 0xFF, 0xE9, 0x4A, 0xCE, 541 | 0xF2, 0x00, 0x00, 0x06, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x44, 0x5D, 0x22, 0x00, 0x00, 0x00, 0x00, 542 | 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 543 | 0x00, 0xBB, 0xFF, 0x59, 0x19, 0x4E, 0x39, 0x00, 0x00, 0xBB, 0xFF, 0x9B, 0xF4, 0xFF, 0xFF, 0xB0, 544 | 0x00, 0xBB, 0xFF, 0xF6, 0x7F, 0x88, 0xFF, 0xFF, 0x63, 0xBB, 0xFF, 0x90, 0x00, 0x00, 0xAC, 0xFF, 545 | 0xAA, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 0xB6, 0xBB, 0xFF, 0x5F, 0x00, 0x00, 0x77, 0xFF, 546 | 0xB4, 0xBB, 0xFF, 0xB2, 0x00, 0x00, 0xC5, 0xFF, 0xA3, 0xBB, 0xFF, 0xFF, 0xBF, 0xC5, 0xFF, 0xFF, 547 | 0x44, 0xBB, 0xFA, 0x4E, 0xE5, 0xFF, 0xFA, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x04, 0x00, 548 | 0x00, 0x00, 0x00, 0x00, 0x33, 0x50, 0x4C, 0x11, 0x00, 0x00, 0x19, 0xCE, 0xFF, 0xFF, 0xFF, 0xFC, 549 | 0x13, 0x00, 0xC9, 0xFF, 0xDA, 0x6E, 0x92, 0x9D, 0x00, 0x26, 0xFF, 0xFF, 0x2A, 0x00, 0x00, 0x00, 550 | 0x00, 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 551 | 0x00, 0x24, 0xFF, 0xFF, 0x48, 0x00, 0x00, 0x1B, 0x00, 0x00, 0xC3, 0xFF, 0xF4, 0xAC, 0xB4, 0xF6, 552 | 0x00, 0x00, 0x17, 0xB2, 0xFC, 0xFF, 0xFF, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0C, 0x06, 0x00, 553 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x5D, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 554 | 0xF2, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x50, 0x00, 0x00, 0x0E, 0x4E, 555 | 0x44, 0x00, 0xF0, 0xFF, 0x50, 0x00, 0x3D, 0xF0, 0xFF, 0xFF, 0xC7, 0xD2, 0xFF, 0x50, 0x00, 0xE1, 556 | 0xFF, 0xDA, 0x72, 0xC3, 0xFF, 0xFF, 0x50, 0x33, 0xFF, 0xFF, 0x2A, 0x00, 0x06, 0xF6, 0xFF, 0x50, 557 | 0x4E, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0xB6, 0xFF, 0x50, 0x4E, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0xBB, 558 | 0xFF, 0x50, 0x26, 0xFF, 0xFF, 0x37, 0x00, 0x0E, 0xFA, 0xFF, 0x50, 0x00, 0xCC, 0xFF, 0xEE, 0xA5, 559 | 0xD8, 0xFA, 0xFF, 0x50, 0x00, 0x1D, 0xD6, 0xFF, 0xFC, 0x85, 0x90, 0xFF, 0x50, 0x00, 0x00, 0x00, 560 | 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x50, 0x3F, 0x02, 0x00, 0x00, 0x00, 561 | 0x19, 0xCE, 0xFF, 0xFF, 0xFF, 0xDD, 0x26, 0x00, 0x00, 0xBF, 0xFF, 0xAA, 0x4C, 0x90, 0xFF, 0xD0, 562 | 0x00, 0x24, 0xFF, 0xFF, 0x0E, 0x00, 0x00, 0xF4, 0xFF, 0x1D, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 563 | 0xFF, 0xFF, 0x44, 0x4C, 0xFF, 0xF8, 0x63, 0x63, 0x63, 0x63, 0x63, 0x1B, 0x1B, 0xFF, 0xFF, 0x30, 564 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xFF, 0xE9, 0x9B, 0x96, 0xAA, 0xAE, 0x00, 0x00, 0x04, 565 | 0x8A, 0xF4, 0xFF, 0xFF, 0xFA, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x00, 0x00, 566 | 0x00, 0x00, 0x13, 0x57, 0x63, 0x57, 0x17, 0x00, 0x17, 0xE9, 0xFF, 0xFF, 0xFF, 0x3D, 0x00, 0x5D, 567 | 0xFF, 0xF0, 0x57, 0x5B, 0x00, 0x00, 0x6C, 0xFF, 0xC5, 0x3D, 0x2A, 0x00, 0x81, 0xFF, 0xFF, 0xFF, 568 | 0xFF, 0xAE, 0x00, 0x44, 0xA1, 0xFF, 0xD2, 0x63, 0x44, 0x00, 0x00, 0x63, 0xFF, 0xB4, 0x00, 0x00, 569 | 0x00, 0x00, 0x63, 0xFF, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 0xB4, 0x00, 0x00, 0x00, 0x00, 570 | 0x63, 0xFF, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 571 | 0xB4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x4E, 0x44, 0x00, 0x24, 0x3D, 0x13, 0x00, 0x3D, 0xF0, 572 | 0xFF, 0xFF, 0xC7, 0xB6, 0xFF, 0x50, 0x00, 0xDD, 0xFF, 0xD6, 0x74, 0xC3, 0xFF, 0xFF, 0x50, 0x30, 573 | 0xFF, 0xFF, 0x28, 0x00, 0x02, 0xF2, 0xFF, 0x50, 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0xB6, 0xFF, 574 | 0x50, 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0x50, 0x24, 0xFF, 0xFF, 0x35, 0x00, 0x06, 575 | 0xF0, 0xFF, 0x50, 0x00, 0xCC, 0xFF, 0xE9, 0xA3, 0xD2, 0xFF, 0xFF, 0x50, 0x00, 0x24, 0xD6, 0xFF, 576 | 0xFC, 0x88, 0xF0, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x00, 0xF6, 0xFF, 0x4C, 0x00, 0x5D, 577 | 0x44, 0x08, 0x04, 0x68, 0xFF, 0xFA, 0x13, 0x00, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x00, 578 | 0x00, 0x33, 0x6A, 0x99, 0x9B, 0x70, 0x26, 0x00, 0x00, 0x44, 0x5D, 0x22, 0x00, 0x00, 0x00, 0x00, 579 | 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 580 | 0x00, 0xBB, 0xFF, 0x59, 0x15, 0x4E, 0x48, 0x02, 0x00, 0xBB, 0xFF, 0x96, 0xF4, 0xFF, 0xFF, 0xDF, 581 | 0x1D, 0xBB, 0xFF, 0xFF, 0x8A, 0x77, 0xF2, 0xFF, 0x90, 0xBB, 0xFF, 0xA5, 0x00, 0x00, 0x9D, 0xFF, 582 | 0xAE, 0xBB, 0xFF, 0x5F, 0x00, 0x00, 0x6E, 0xFF, 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 583 | 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 584 | 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 0xAE, 0x2C, 0x55, 0x0C, 0xE5, 0xFF, 0x77, 0x7B, 585 | 0xB2, 0x2E, 0x2E, 0x3D, 0x17, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 586 | 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x2C, 587 | 0x55, 0x0C, 0x00, 0x00, 0xE5, 0xFF, 0x77, 0x00, 0x00, 0x7B, 0xB2, 0x2E, 0x00, 0x00, 0x2E, 0x3D, 588 | 0x17, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 589 | 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 590 | 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xCC, 0xFF, 0x5D, 0x48, 0x52, 591 | 0xFA, 0xFF, 0x50, 0xF8, 0xFF, 0xFF, 0xE1, 0x08, 0x79, 0x9B, 0x72, 0x13, 0x00, 0x44, 0x5D, 0x22, 592 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 593 | 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x1B, 0x3D, 0x3D, 594 | 0x02, 0xBB, 0xFF, 0x5D, 0x00, 0x1F, 0xE7, 0xFF, 0x72, 0x00, 0xBB, 0xFF, 0x5D, 0x15, 0xDD, 0xFF, 595 | 0x88, 0x00, 0x00, 0xBB, 0xFF, 0x5F, 0xCC, 0xFF, 0x9D, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0xDF, 0xFF, 596 | 0xFC, 0x0E, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0xFF, 0xE1, 0xFF, 0xAA, 0x00, 0x00, 0x00, 0xBB, 0xFF, 597 | 0x7F, 0x1B, 0xEE, 0xFF, 0x68, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x52, 0xFF, 0xF8, 0x2E, 0x00, 598 | 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x9D, 0xFF, 0xDA, 0x0C, 0x44, 0x5D, 0x22, 0xBB, 0xFF, 0x5D, 0xBB, 599 | 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 600 | 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0xBB, 0xFF, 0x5D, 0x2E, 0x37, 0x00, 601 | 0x1B, 0x4E, 0x44, 0x00, 0x00, 0x15, 0x4E, 0x4A, 0x04, 0x00, 0xBB, 0xFC, 0x6E, 0xFC, 0xFF, 0xFF, 602 | 0xCE, 0x57, 0xF8, 0xFF, 0xFF, 0xDF, 0x13, 0xBB, 0xFF, 0xFC, 0x83, 0x8A, 0xFF, 0xFF, 0xFF, 0x90, 603 | 0x7D, 0xFC, 0xFF, 0x74, 0xBB, 0xFF, 0xA1, 0x00, 0x00, 0xC7, 0xFF, 0xB0, 0x00, 0x00, 0xAE, 0xFF, 604 | 0x9D, 0xBB, 0xFF, 0x5F, 0x00, 0x00, 0xB0, 0xFF, 0x94, 0x00, 0x00, 0xA1, 0xFF, 0xA1, 0xBB, 0xFF, 605 | 0x5D, 0x00, 0x00, 0xAE, 0xFF, 0x94, 0x00, 0x00, 0xA1, 0xFF, 0xA1, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 606 | 0xAE, 0xFF, 0x94, 0x00, 0x00, 0xA1, 0xFF, 0xA1, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xAE, 0xFF, 0x94, 607 | 0x00, 0x00, 0xA1, 0xFF, 0xA1, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0xAE, 0xFF, 0x94, 0x00, 0x00, 0xA1, 608 | 0xFF, 0xA1, 0x2E, 0x37, 0x00, 0x17, 0x4E, 0x4A, 0x04, 0x00, 0xBB, 0xFC, 0x6C, 0xFA, 0xFF, 0xFF, 609 | 0xE1, 0x1D, 0xBB, 0xFF, 0xFF, 0x8A, 0x74, 0xF2, 0xFF, 0x90, 0xBB, 0xFF, 0xA5, 0x00, 0x00, 0x9D, 610 | 0xFF, 0xAE, 0xBB, 0xFF, 0x5F, 0x00, 0x00, 0x6E, 0xFF, 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 611 | 0xFF, 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 612 | 0xFF, 0xAE, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 0xAE, 0x00, 0x00, 0x00, 0x35, 0x50, 0x44, 613 | 0x02, 0x00, 0x00, 0x00, 0x19, 0xCE, 0xFF, 0xFF, 0xFF, 0xE3, 0x3B, 0x00, 0x00, 0xC7, 0xFF, 0xD4, 614 | 0x6C, 0xB4, 0xFF, 0xEE, 0x13, 0x28, 0xFF, 0xFF, 0x22, 0x00, 0x00, 0xDA, 0xFF, 0x68, 0x4E, 0xFF, 615 | 0xFA, 0x00, 0x00, 0x00, 0xAA, 0xFF, 0x9B, 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0xAE, 0xFF, 0x99, 616 | 0x11, 0xFC, 0xFF, 0x3D, 0x00, 0x0C, 0xEB, 0xFF, 0x5B, 0x00, 0x99, 0xFF, 0xEE, 0xAA, 0xD8, 0xFF, 617 | 0xE3, 0x0C, 0x00, 0x04, 0x8A, 0xFA, 0xFF, 0xFF, 0xC1, 0x22, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0C, 618 | 0x06, 0x00, 0x00, 0x00, 0x2E, 0x3B, 0x00, 0x19, 0x4E, 0x39, 0x00, 0x00, 0xBB, 0xFF, 0x70, 0xF4, 619 | 0xFF, 0xFF, 0xB0, 0x00, 0xBB, 0xFF, 0xF6, 0x7F, 0x88, 0xFF, 0xFF, 0x63, 0xBB, 0xFF, 0x90, 0x00, 620 | 0x00, 0xA3, 0xFF, 0xAA, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x6A, 0xFF, 0xB6, 0xBB, 0xFF, 0x5F, 0x00, 621 | 0x00, 0x74, 0xFF, 0xB4, 0xBB, 0xFF, 0xB2, 0x00, 0x00, 0xBD, 0xFF, 0xA3, 0xBB, 0xFF, 0xFF, 0xBF, 622 | 0xC3, 0xFF, 0xFF, 0x3B, 0xBB, 0xFF, 0x88, 0xE5, 0xFF, 0xFA, 0x72, 0x00, 0xBB, 0xFF, 0x5B, 0x00, 623 | 0x0C, 0x04, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 624 | 0x00, 0x00, 0x00, 0x00, 0x72, 0x9B, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x4E, 625 | 0x44, 0x00, 0x24, 0x3D, 0x13, 0x00, 0x3D, 0xF0, 0xFF, 0xFF, 0xC5, 0xB8, 0xFF, 0x50, 0x00, 0xE1, 626 | 0xFF, 0xD6, 0x72, 0xC3, 0xFF, 0xFF, 0x50, 0x33, 0xFF, 0xFF, 0x2A, 0x00, 0x06, 0xF6, 0xFF, 0x50, 627 | 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0xB6, 0xFF, 0x50, 0x4E, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0xB8, 628 | 0xFF, 0x50, 0x26, 0xFF, 0xFF, 0x35, 0x00, 0x0A, 0xF6, 0xFF, 0x50, 0x00, 0xCC, 0xFF, 0xE9, 0xA3, 629 | 0xD2, 0xFA, 0xFF, 0x50, 0x00, 0x22, 0xD6, 0xFF, 0xFF, 0x8C, 0xE1, 0xFF, 0x50, 0x00, 0x00, 0x00, 630 | 0x0A, 0x06, 0x00, 0xF2, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x50, 0x00, 631 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x9B, 632 | 0x30, 0x2E, 0x37, 0x00, 0x0E, 0x4E, 0x22, 0xBB, 0xFA, 0x35, 0xE9, 0xFF, 0x5F, 0xBB, 0xFF, 0xF4, 633 | 0xF4, 0xB4, 0x3B, 0xBB, 0xFF, 0xCC, 0x0C, 0x00, 0x00, 0xBB, 0xFF, 0x63, 0x00, 0x00, 0x00, 0xBB, 634 | 0xFF, 0x5D, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 635 | 0x00, 0xBB, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x4E, 0x4E, 0x26, 0x00, 0x00, 0xAC, 636 | 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0x44, 0xFF, 0xF8, 0x55, 0x59, 0xA3, 0x44, 0x41, 0xFF, 0xFF, 0x79, 637 | 0x0C, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0xFF, 0xF6, 0x88, 0x08, 0x00, 0x00, 0x4C, 0xC3, 0xFF, 0xFF, 638 | 0x9B, 0x04, 0x00, 0x00, 0x00, 0x74, 0xFF, 0xEB, 0x50, 0xD8, 0x9D, 0x7D, 0xC9, 0xFF, 0xB0, 0x37, 639 | 0xE9, 0xFF, 0xFF, 0xFF, 0xC1, 0x1B, 0x00, 0x00, 0x0A, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x02, 0xE1, 640 | 0x99, 0x00, 0x00, 0x00, 0x50, 0xFF, 0xB8, 0x3D, 0x39, 0x66, 0xFA, 0xFF, 0xFF, 0xFF, 0xF2, 0x41, 641 | 0xC1, 0xFF, 0xC5, 0x63, 0x5F, 0x00, 0x9B, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x9B, 0xFF, 0xA1, 0x00, 642 | 0x00, 0x00, 0x9B, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x9B, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x72, 0xFF, 643 | 0xFA, 0xA5, 0xB6, 0x00, 0x11, 0xC7, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x37, 644 | 0x3D, 0x15, 0x00, 0x00, 0x22, 0x3D, 0x28, 0xEB, 0xFF, 0x57, 0x00, 0x00, 0x94, 0xFF, 0xA7, 0xEB, 645 | 0xFF, 0x57, 0x00, 0x00, 0x94, 0xFF, 0xA7, 0xEB, 0xFF, 0x57, 0x00, 0x00, 0x94, 0xFF, 0xA7, 0xEB, 646 | 0xFF, 0x57, 0x00, 0x00, 0x96, 0xFF, 0xA7, 0xEB, 0xFF, 0x57, 0x00, 0x00, 0xA1, 0xFF, 0xA7, 0xDF, 647 | 0xFF, 0x79, 0x00, 0x00, 0xD6, 0xFF, 0xA7, 0x9F, 0xFF, 0xF8, 0xA7, 0xCC, 0xFF, 0xFF, 0xA7, 0x19, 648 | 0xCC, 0xFF, 0xFF, 0xD2, 0x4C, 0xFF, 0xA7, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x3D, 649 | 0x3D, 0x13, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x1D, 0xB8, 0xFF, 0x8E, 0x00, 0x00, 0x0A, 0xFA, 0xFF, 650 | 0x3D, 0x57, 0xFF, 0xE5, 0x00, 0x00, 0x5D, 0xFF, 0xDF, 0x00, 0x04, 0xEE, 0xFF, 0x3D, 0x00, 0xB2, 651 | 0xFF, 0x7D, 0x00, 0x00, 0x90, 0xFF, 0x92, 0x0A, 0xFA, 0xFF, 0x1F, 0x00, 0x00, 0x30, 0xFF, 0xE7, 652 | 0x5B, 0xFF, 0xBD, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xFF, 0xBF, 0xFF, 0x5B, 0x00, 0x00, 0x00, 0x00, 653 | 0x6E, 0xFF, 0xFF, 0xF2, 0x04, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFA, 0xFF, 0x94, 0x00, 0x00, 0x00, 654 | 0x2E, 0x3D, 0x15, 0x00, 0x00, 0x2E, 0x3D, 0x28, 0x00, 0x00, 0x22, 0x3D, 0x28, 0xA7, 0xFF, 0x8A, 655 | 0x00, 0x02, 0xF6, 0xFF, 0xD2, 0x00, 0x00, 0xA7, 0xFF, 0x77, 0x57, 0xFF, 0xC9, 0x00, 0x39, 0xFF, 656 | 0xE9, 0xFF, 0x0E, 0x00, 0xF2, 0xFF, 0x2E, 0x0E, 0xFC, 0xFC, 0x0C, 0x77, 0xFF, 0x77, 0xFF, 0x50, 657 | 0x35, 0xFF, 0xE7, 0x00, 0x00, 0xC5, 0xFF, 0x50, 0xB4, 0xEB, 0x13, 0xFF, 0x8E, 0x77, 0xFF, 0x9D, 658 | 0x00, 0x00, 0x7F, 0xFF, 0x85, 0xF4, 0xA7, 0x00, 0xDA, 0xB8, 0xAC, 0xFF, 0x50, 0x00, 0x00, 0x37, 659 | 0xFF, 0xB2, 0xFF, 0x6E, 0x00, 0xA3, 0xF2, 0xDF, 0xFA, 0x06, 0x00, 0x00, 0x00, 0xF2, 0xFA, 0xFF, 660 | 0x37, 0x00, 0x61, 0xFF, 0xFF, 0xBD, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xF8, 0x02, 0x00, 0x30, 661 | 0xFF, 0xFF, 0x74, 0x00, 0x00, 0x2C, 0x3D, 0x2E, 0x00, 0x00, 0x02, 0x3D, 0x3D, 0x19, 0x52, 0xFF, 662 | 0xFC, 0x2A, 0x00, 0x7B, 0xFF, 0xE9, 0x13, 0x00, 0xAA, 0xFF, 0xC1, 0x1F, 0xF6, 0xFF, 0x52, 0x00, 663 | 0x00, 0x15, 0xE9, 0xFF, 0xDF, 0xFF, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFF, 0xFF, 0xF2, 0x13, 664 | 0x00, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x41, 0xFF, 0xFA, 0x9D, 665 | 0xFF, 0xDF, 0x0C, 0x00, 0x0A, 0xDD, 0xFF, 0x7F, 0x02, 0xD4, 0xFF, 0x94, 0x00, 0x92, 0xFF, 0xDD, 666 | 0x06, 0x00, 0x39, 0xFF, 0xFF, 0x3B, 0x3B, 0x3D, 0x17, 0x00, 0x00, 0x00, 0x37, 0x3D, 0x1D, 0xB6, 667 | 0xFF, 0xA7, 0x00, 0x00, 0x15, 0xFC, 0xFF, 0x3D, 0x4A, 0xFF, 0xF8, 0x04, 0x00, 0x66, 0xFF, 0xDF, 668 | 0x00, 0x02, 0xE3, 0xFF, 0x52, 0x00, 0xBB, 0xFF, 0x7F, 0x00, 0x00, 0x7F, 0xFF, 0xA7, 0x0E, 0xFC, 669 | 0xFF, 0x22, 0x00, 0x00, 0x1D, 0xFC, 0xF8, 0x66, 0xFF, 0xC1, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xFF, 670 | 0xE3, 0xFF, 0x61, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xFF, 0xFF, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 671 | 0x02, 0xE3, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xE9, 0xFF, 0x3D, 0x00, 0x00, 0x00, 672 | 0x1D, 0x46, 0xA7, 0xFF, 0xD6, 0x00, 0x00, 0x00, 0x00, 0x63, 0xFF, 0xFF, 0xEE, 0x35, 0x00, 0x00, 673 | 0x00, 0x00, 0x39, 0x9B, 0x72, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x3D, 0x3D, 0x3D, 0x3D, 674 | 0x3D, 0x2A, 0x57, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0x33, 0x94, 0x94, 0x94, 0xFA, 0xFF, 0x83, 675 | 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xCC, 0x02, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x1F, 0x00, 0x00, 0x13, 676 | 0xE7, 0xFF, 0x57, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x68, 0xFF, 0xFF, 0xB6, 677 | 0xAE, 0xAE, 0xA1, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x00, 0x00, 0x17, 0x83, 0xA5, 0x35, 678 | 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x4E, 0x00, 0x00, 0xF2, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xF2, 0xFF, 679 | 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x00, 0x00, 0x02, 0x50, 0xFF, 0xF6, 0x00, 0x00, 0xB4, 0xFF, 680 | 0xC9, 0x46, 0x00, 0x00, 0x7D, 0xEB, 0xFF, 0x96, 0x00, 0x00, 0x00, 0x11, 0xFA, 0xFF, 0x00, 0x00, 681 | 0x00, 0x00, 0xF2, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xFF, 682 | 0x7B, 0x19, 0x00, 0x00, 0x88, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x30, 0x52, 0x1B, 0x39, 0x52, 683 | 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 684 | 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0xA7, 0xF2, 0x39, 0x52, 0x3D, 0xA5, 685 | 0x7F, 0x11, 0x00, 0x00, 0x5B, 0xFF, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x39, 0xFF, 0xB8, 0x00, 0x00, 686 | 0x00, 0x0C, 0xFF, 0xBB, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xC1, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xF8, 687 | 0x41, 0x02, 0x00, 0x00, 0x57, 0xD2, 0xFF, 0xA7, 0x00, 0x00, 0xAE, 0xFF, 0xE5, 0x74, 0x00, 0x0C, 688 | 0xFF, 0xE9, 0x06, 0x00, 0x00, 0x0C, 0xFF, 0xBB, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xBB, 0x00, 0x00, 689 | 0x1D, 0x8E, 0xFF, 0xB6, 0x00, 0x00, 0x5D, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x1F, 0x50, 0x28, 0x00, 690 | 0x00, 0x00, 0x00, 0x46, 0x90, 0x5D, 0x15, 0x00, 0x00, 0x2E, 0x4E, 0xFF, 0xFF, 0xFF, 0xFA, 0xB4, 691 | 0xAE, 0xF0, 0x41, 0x52, 0x08, 0x46, 0xA3, 0xEE, 0xE7, 0x79, 0x00, 0x44, 0xBB, 0xD2, 0x88, 0x04, 692 | 0x24, 0xFA, 0xC5, 0x9D, 0xFC, 0x83, 0x5B, 0xFF, 0x11, 0x00, 0xAC, 0xB4, 0x3F, 0xFF, 0x7F, 0x4A, 693 | 0xE5, 0xA3, 0x00, 0x92, 0xFF, 0xFF, 0xDD, 0x1F, 0x00, 0x00, 0x0C, 0x24, 0x00, 0x00, 0x00, 0x0E, 694 | 0x4E, 0x6F, 0x74, 0x6F, 0x20, 0x53, 0x61, 0x6E, 0x73, 0x20, 0x42, 0x6F, 0x6C, 0x64, 0x00, 0x0D, 695 | 0x4E, 0x6F, 0x74, 0x6F, 0x53, 0x61, 0x6E, 0x73, 0x2D, 0x42, 0x6F, 0x6C, 0x64, 0x01, 696 | }; 697 | --------------------------------------------------------------------------------