diff --git a/keyboards/dasky/reverb/config.h b/keyboards/dasky/reverb/config.h index 45dd950ff21..29cc0b04c77 100644 --- a/keyboards/dasky/reverb/config.h +++ b/keyboards/dasky/reverb/config.h @@ -3,6 +3,8 @@ #pragma once +#define DEBUG_MATRIX_SCAN_RATE // only want api + #define SPI_DRIVER SPID0 #define SPI_SCK_PIN GP18 #define SPI_MOSI_PIN GP19 diff --git a/keyboards/dasky/reverb/graphics/display.c b/keyboards/dasky/reverb/graphics/display.c new file mode 100644 index 00000000000..239a8c5221f --- /dev/null +++ b/keyboards/dasky/reverb/graphics/display.c @@ -0,0 +1,138 @@ +// Copyright 2023 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "display.h" +#include "graphics/splash.qgf.h" +#include "graphics/reverb.qgf.h" +#include "graphics/robotomono20.qff.h" +#include +#include + +static painter_device_t reverb_display; +static painter_image_handle_t reverb_logo; +static painter_font_handle_t roboto_font; +static deferred_token display_task_token; +static uint32_t key_pressed_count = 0; + +static painter_device_t reverb_surface; +static uint16_t reverb_surface_fb[240 * 240]; + +uint32_t display_task_callback(uint32_t trigger_time, void *cb_arg) { + display_task_kb(); + return 100; +} + +void display_init_kb(void) { + reverb_display = qp_gc9a01_make_spi_device(240, 240, DISPLAY_CS, DISPLAY_DC, DISPLAY_RST, 2, 0); // always init display + qp_init(reverb_display, QP_ROTATION_0); + if (!display_init_user()) { + return; + } + reverb_surface = qp_rgb565_make_surface(240, 240, reverb_surface_fb); + qp_init(reverb_surface, QP_ROTATION_0); + painter_image_handle_t splash_image; + splash_image = qp_load_image_mem(gfx_splash); + reverb_logo = qp_load_image_mem(gfx_reverb); + qp_drawimage(reverb_display, 0, 0, splash_image); + qp_flush(reverb_display); + qp_close_image(splash_image); + roboto_font = qp_load_font_mem(font_robotomono20); + display_task_token = defer_exec(2000, display_task_callback, NULL); +} + +__attribute__((weak)) bool display_init_user(void) { + return true; +} + +void display_task_kb(void) { + if (!display_task_user()) { + return; + } + static bool first_draw = true; + static uint32_t last_timer = 0; + static uint32_t last_wpm = UINT32_MAX; + static uint32_t last_scan_rate = 0; + static uint32_t last_key_pressed_count = UINT32_MAX; + static uint8_t last_hue = 0; + static uint8_t last_sat = 0; + static uint8_t last_val = 0; + bool rgb_redraw = false; + + if (first_draw) { + qp_rect(reverb_display, 0, 0, 239, 239, 0, 0, 0, true); + first_draw = false; + } + + char buffer[64] = {0}; + + if (last_hue != rgb_matrix_get_hue() || last_sat != rgb_matrix_get_sat() || last_val != rgb_matrix_get_val()) { + last_hue = rgb_matrix_get_hue(); + last_sat = rgb_matrix_get_sat(); + last_val = rgb_matrix_get_val(); + qp_drawimage_recolor(reverb_surface, 60, 40, reverb_logo, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), 0, 0, 0); + rgb_redraw = true; + } + + if (rgb_redraw || last_scan_rate != get_matrix_scan_rate()) { + snprintf(buffer, sizeof(buffer), "Scan Rate %ld", get_matrix_scan_rate()); + int16_t width = qp_textwidth(roboto_font, buffer); + qp_line(reverb_surface, 17, 101, 220, 101, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128)); + qp_rect(reverb_surface, 16, 125 - roboto_font->line_height, 221, 125, 0, 0, 0, true); + qp_drawtext_recolor(reverb_surface, (120 - (width / 2)), (125 - roboto_font->line_height), roboto_font, buffer, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), 0, 0, 0); + qp_line(reverb_surface, 16, 126, 221, 126, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128)); + last_scan_rate = get_matrix_scan_rate(); + } + if (rgb_redraw || last_key_pressed_count != key_pressed_count) { + snprintf(buffer, sizeof(buffer), "Keys Pressed"); + int16_t width = qp_textwidth(roboto_font, buffer); + qp_rect(reverb_surface, 30, 150 - roboto_font->line_height, 209, 150, 0, 0, 0, true); + qp_drawtext_recolor(reverb_surface, (120 - (width / 2)), (150 - roboto_font->line_height), roboto_font, buffer, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), 0, 0, 0); + snprintf(buffer, sizeof(buffer), "%ld", key_pressed_count); + width = qp_textwidth(roboto_font, buffer); + qp_rect(reverb_surface, 30, 172 - roboto_font->line_height, 173, 172, 0, 0, 0, true); + qp_drawtext_recolor(reverb_surface, (120 - (width / 2)), (172 - roboto_font->line_height), roboto_font, buffer, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), 0, 0, 0); + qp_line(reverb_surface, 30, 173, 209, 173, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128)); + last_key_pressed_count = key_pressed_count; + } + if (rgb_redraw || last_wpm != get_current_wpm()) { + snprintf(buffer, sizeof(buffer), "WPM %d", get_current_wpm()); + int16_t width = qp_textwidth(roboto_font, buffer); + qp_rect(reverb_surface, 56, 200 - roboto_font->line_height, 184, 200, 0, 0, 0, true); + qp_drawtext_recolor(reverb_surface, (120 - (width / 2)), (200 - roboto_font->line_height), roboto_font, buffer, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), 0, 0, 0); + qp_line(reverb_surface, 56, 201, 184, 201, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128)); + last_wpm = get_current_wpm(); + } + + if (rgb_redraw || timer_elapsed(last_timer) >= 1000) { + static uint8_t seconds = 0; + static uint8_t x = 0; + static uint8_t y = 0; + if (x && y) { + qp_circle(reverb_surface, x, y, 4, 0, 0, 0, true); + } + double radians = 0.10471975511966 * seconds; + x = (110 * cos(radians)) + 119; + y = (110 * sin(radians)) + 119; + qp_circle(reverb_surface, x, y, 4, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), true); + qp_circle(reverb_surface, 119, 119, 105, rgb_matrix_get_hue(), rgb_matrix_get_sat(), MAX(rgb_matrix_get_val(), 128), false); + if (seconds == 59) { + seconds = 0; + } else if (timer_elapsed(last_timer) >= 1000) { + last_timer = timer_read32(); + seconds++; + } + } + + qp_rgb565_surface_draw(reverb_surface, reverb_display, 0, 0); +} + +__attribute__((weak)) bool display_task_user(void) { + return true; +} + +void display_key_counter(void) { + if (key_pressed_count == UINT32_MAX) { + key_pressed_count = 0; + } + key_pressed_count++; +} diff --git a/keyboards/dasky/reverb/graphics/display.h b/keyboards/dasky/reverb/graphics/display.h new file mode 100644 index 00000000000..ad433fde699 --- /dev/null +++ b/keyboards/dasky/reverb/graphics/display.h @@ -0,0 +1,12 @@ +// Copyright 2023 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "qp.h" + +void display_key_counter(void); +void display_init_kb(void); +bool display_init_user(void); +void display_task_kb(void); +bool display_task_user(void); diff --git a/keyboards/dasky/reverb/graphics/reverb.qgf.c b/keyboards/dasky/reverb/graphics/reverb.qgf.c new file mode 100644 index 00000000000..27c31d41aa2 --- /dev/null +++ b/keyboards/dasky/reverb/graphics/reverb.qgf.c @@ -0,0 +1,59 @@ +// Copyright 2023 QMK -- generated source code only, image retains original copyright +// SPDX-License-Identifier: GPL-2.0-or-later + +// This file was auto-generated by `qmk painter-convert-graphics -i reverb.png -f mono2` + +#include + +const uint32_t gfx_reverb_length = 736; + +// clang-format off +const uint8_t gfx_reverb[736] = { + 0x00, 0xFF, 0x12, 0x00, 0x00, 0x51, 0x47, 0x46, 0x01, 0xE0, 0x02, 0x00, 0x00, 0x1F, 0xFD, 0xFF, + 0xFF, 0x78, 0x00, 0x32, 0x00, 0x01, 0x00, 0x01, 0xFE, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x02, 0xFD, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xE8, 0x03, 0x05, 0xFA, 0xB0, 0x02, 0x00, + 0x3C, 0x00, 0x8F, 0xF8, 0xFF, 0xC7, 0xFF, 0x3F, 0x30, 0x80, 0x83, 0xFF, 0x0F, 0xFF, 0xCF, 0xFF, + 0x1F, 0x00, 0xF8, 0x03, 0xFF, 0x85, 0x7F, 0x70, 0x80, 0x83, 0xFF, 0x0F, 0x03, 0xFF, 0x8D, 0x7F, + 0x00, 0xF8, 0xFF, 0xBF, 0xFF, 0x7F, 0x70, 0x80, 0x83, 0xFF, 0x0F, 0xFF, 0xBF, 0x02, 0xFF, 0x8C, + 0x00, 0xF8, 0xFF, 0x3F, 0xFF, 0x7F, 0x70, 0x80, 0x83, 0xFF, 0x0F, 0xFF, 0x3F, 0x02, 0xFF, 0xB8, + 0x01, 0xF8, 0xFF, 0x3F, 0xFF, 0x7F, 0x70, 0x80, 0x83, 0xFF, 0x0F, 0xFF, 0x3F, 0xFE, 0xFF, 0x03, + 0xF8, 0xFF, 0x3F, 0xFE, 0x7F, 0x70, 0x80, 0x83, 0xFF, 0x0F, 0xFF, 0x3F, 0xFE, 0xFF, 0x07, 0xF8, + 0x0F, 0x3F, 0x3E, 0x00, 0x7F, 0x80, 0xC3, 0x07, 0xF0, 0x0F, 0x3F, 0x3C, 0xFE, 0x07, 0xF8, 0x07, + 0x3E, 0x3C, 0x00, 0x7F, 0xC0, 0xC3, 0x03, 0xF0, 0x0F, 0x02, 0x3C, 0x83, 0xF8, 0x07, 0xF8, 0x07, + 0x02, 0x3C, 0x86, 0x00, 0xFF, 0xC0, 0xC3, 0x03, 0xF0, 0x0F, 0x02, 0x3C, 0x83, 0xF8, 0x0F, 0xF8, + 0x07, 0x02, 0x3C, 0x8C, 0x00, 0xFF, 0xC0, 0xC3, 0x03, 0xF0, 0x0F, 0x3C, 0x38, 0xF0, 0x0F, 0xF8, + 0x07, 0x02, 0x3C, 0x86, 0x00, 0xFF, 0xC0, 0xC3, 0x03, 0xF0, 0x0F, 0x02, 0x38, 0x83, 0xF0, 0x0F, + 0xF8, 0x07, 0x02, 0x3C, 0x86, 0x00, 0xFF, 0xC0, 0xE3, 0x03, 0xF0, 0x0F, 0x02, 0x38, 0x83, 0xF0, + 0x0F, 0xF8, 0x07, 0x02, 0x3C, 0x86, 0x00, 0xFE, 0xC0, 0xE3, 0x03, 0xF0, 0x0F, 0x02, 0x38, 0x83, + 0xF0, 0x0F, 0xF8, 0x07, 0x02, 0x38, 0x86, 0x00, 0xFE, 0xC0, 0xE3, 0x03, 0xF0, 0x0F, 0x02, 0x38, + 0x83, 0xF0, 0x0F, 0xF8, 0x07, 0x02, 0x3C, 0x86, 0x00, 0xFE, 0xE0, 0xE3, 0x03, 0xF0, 0x0F, 0x02, + 0x38, 0x83, 0xF0, 0x0F, 0xF8, 0x07, 0x02, 0x3C, 0x86, 0x00, 0xFE, 0xE1, 0xE3, 0x03, 0xF0, 0x0F, + 0x02, 0x38, 0x83, 0xF8, 0x07, 0xF8, 0x07, 0x02, 0x3C, 0x86, 0x00, 0xFE, 0xE1, 0xF3, 0x03, 0xF0, + 0x0F, 0x02, 0x38, 0xCF, 0xFC, 0x07, 0xF8, 0x07, 0x3C, 0xFC, 0xFF, 0xFD, 0xE1, 0xF3, 0xFF, 0xEF, + 0x0F, 0x3C, 0xF8, 0xFF, 0x07, 0xF8, 0x07, 0x3E, 0xFC, 0xFF, 0xFD, 0xE1, 0xF3, 0xFF, 0xEF, 0x0F, + 0x3C, 0xFC, 0xFF, 0x03, 0xF8, 0x07, 0x3F, 0xFC, 0xFF, 0xFD, 0xE1, 0xF3, 0xFF, 0xEF, 0x0F, 0x3E, + 0xFC, 0xFF, 0x01, 0xF8, 0xFF, 0x3F, 0xFE, 0xFF, 0xFD, 0xE1, 0xF3, 0xFF, 0xEF, 0xFF, 0x3F, 0xFC, + 0xFF, 0x00, 0xF8, 0xFF, 0x3F, 0xFE, 0xFF, 0xFD, 0xE1, 0xF3, 0xFF, 0xEF, 0xFF, 0x3F, 0xFE, 0xFF, + 0x03, 0xF8, 0xFF, 0x3F, 0x02, 0xFF, 0x86, 0xF9, 0xF1, 0xFB, 0xFF, 0xEF, 0xFF, 0x3F, 0x02, 0xFF, + 0x83, 0x07, 0xF8, 0xFF, 0xBF, 0x02, 0xFF, 0x86, 0xF9, 0xF3, 0xFB, 0xFF, 0xEF, 0xFF, 0x3F, 0x02, + 0xFF, 0x81, 0x0F, 0xF8, 0x02, 0xFF, 0x86, 0x3F, 0x00, 0xF8, 0xF3, 0xFB, 0x03, 0xF0, 0x02, 0xFF, + 0xD3, 0x3F, 0xF8, 0x0F, 0xF8, 0xFF, 0xCF, 0x3F, 0x00, 0xF8, 0xF3, 0xFF, 0x03, 0xF0, 0xFF, 0xDF, + 0x3F, 0xF0, 0x1F, 0xF8, 0xFF, 0xCF, 0x3F, 0x00, 0xF8, 0xF3, 0xFF, 0x03, 0xF0, 0xFF, 0xDF, 0x3F, + 0xE0, 0x1F, 0xF8, 0xF7, 0xDF, 0x3F, 0x00, 0xF8, 0xF3, 0xFF, 0x03, 0xF0, 0xEF, 0xDF, 0x3F, 0xE0, + 0x1F, 0xF8, 0xE7, 0xDF, 0x3F, 0x00, 0xF0, 0xF3, 0xFF, 0x03, 0xF0, 0xEF, 0xFF, 0x3F, 0xE0, 0x1F, + 0xF8, 0xE7, 0xFF, 0x3F, 0x00, 0xF0, 0xFB, 0xFF, 0x03, 0xF0, 0xCF, 0xFF, 0x3F, 0xE0, 0x3F, 0xF8, + 0xC7, 0xFF, 0x3F, 0x00, 0xF0, 0x02, 0xFF, 0x8C, 0x03, 0xF0, 0xCF, 0xFF, 0x3F, 0xE0, 0x3F, 0xF8, + 0xC7, 0xFF, 0x3F, 0x00, 0xF0, 0x02, 0xFF, 0x8C, 0x03, 0xF0, 0x8F, 0xBF, 0x3F, 0xE0, 0x1F, 0xF8, + 0x87, 0xBF, 0x3F, 0x00, 0xF0, 0x02, 0xFF, 0x91, 0x03, 0xF0, 0x8F, 0xBF, 0x3F, 0xE0, 0x1F, 0xF8, + 0x87, 0xBF, 0x3F, 0x00, 0xE0, 0xFF, 0xFD, 0x03, 0xF0, 0x0F, 0x02, 0x3F, 0x83, 0xE0, 0x1F, 0xF8, + 0x07, 0x02, 0x3F, 0x86, 0x00, 0xE0, 0xFF, 0xFD, 0x03, 0xF0, 0x0F, 0x02, 0x3F, 0x83, 0xF0, 0x1F, + 0xF8, 0x07, 0x02, 0x3F, 0x93, 0x00, 0xE0, 0xFF, 0xFD, 0x03, 0xF0, 0x0F, 0x3F, 0x3E, 0xF8, 0x1F, + 0xF8, 0x07, 0x3E, 0xFE, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0x02, 0x0F, 0x8C, 0x3E, 0xFE, 0xFF, 0x0F, + 0xF8, 0x07, 0x3E, 0xFE, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0x02, 0x0F, 0x8C, 0x3E, 0xFC, 0xFF, 0x0F, + 0xF8, 0x07, 0x3E, 0xFC, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0x02, 0x0F, 0x8C, 0x3C, 0xFC, 0xFF, 0x07, + 0xF8, 0x07, 0x3C, 0xFC, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0x02, 0x0F, 0x8C, 0x3C, 0xF8, 0xFF, 0x03, + 0xF8, 0x07, 0x3C, 0xF8, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0x02, 0x0F, 0x8C, 0x38, 0xF8, 0xFF, 0x01, + 0xF8, 0x07, 0x38, 0xF8, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0x02, 0x0F, 0x91, 0x38, 0xF8, 0x7F, 0x00, + 0xF0, 0x07, 0x38, 0xF0, 0xFF, 0xCF, 0x7F, 0xFC, 0xFF, 0x0F, 0x0E, 0x30, 0xF0, 0x0F, 0x2E, 0x00, +}; +// clang-format on diff --git a/keyboards/dasky/reverb/graphics/reverb.qgf.h b/keyboards/dasky/reverb/graphics/reverb.qgf.h new file mode 100644 index 00000000000..d44aeeff964 --- /dev/null +++ b/keyboards/dasky/reverb/graphics/reverb.qgf.h @@ -0,0 +1,11 @@ +// Copyright 2023 QMK -- generated source code only, image retains original copyright +// SPDX-License-Identifier: GPL-2.0-or-later + +// This file was auto-generated by `qmk painter-convert-graphics -i reverb.png -f mono2` + +#pragma once + +#include + +extern const uint32_t gfx_reverb_length; +extern const uint8_t gfx_reverb[736]; diff --git a/keyboards/dasky/reverb/graphics/robotomono20.qff.c b/keyboards/dasky/reverb/graphics/robotomono20.qff.c new file mode 100644 index 00000000000..a232ffadfbb --- /dev/null +++ b/keyboards/dasky/reverb/graphics/robotomono20.qff.c @@ -0,0 +1,320 @@ +// Copyright 2023 QMK -- generated source code only, font retains original copyright +// SPDX-License-Identifier: GPL-2.0-or-later + +// This file was auto-generated by `qmk painter-convert-font-image -i robotomono20.png -f mono4` + +#include + +const uint32_t font_robotomono20_length = 4904; + +// clang-format off +const uint8_t font_robotomono20[4904] = { + 0x00, 0xFF, 0x14, 0x00, 0x00, 0x51, 0x46, 0x46, 0x01, 0x28, 0x13, 0x00, 0x00, 0xD7, 0xEC, 0xFF, + 0xFF, 0x16, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0xFE, 0x1D, 0x01, 0x00, 0x0C, 0x00, + 0x00, 0x8C, 0x00, 0x00, 0x0C, 0x0E, 0x00, 0xCC, 0x12, 0x00, 0xCC, 0x1F, 0x00, 0x8C, 0x2F, 0x00, + 0x0C, 0x3D, 0x00, 0xCC, 0x49, 0x00, 0x4C, 0x4F, 0x00, 0x4C, 0x62, 0x00, 0x0C, 0x76, 0x00, 0x4C, + 0x7F, 0x00, 0xCC, 0x89, 0x00, 0x0C, 0x8F, 0x00, 0xCC, 0x91, 0x00, 0x4C, 0x95, 0x00, 0x0C, 0xA4, + 0x00, 0xCC, 0xB0, 0x00, 0x8C, 0xBE, 0x00, 0x4C, 0xCB, 0x00, 0x4C, 0xD8, 0x00, 0x8C, 0xE4, 0x00, + 0x4C, 0xF2, 0x00, 0x8C, 0xFF, 0x00, 0x0C, 0x0D, 0x01, 0xCC, 0x19, 0x01, 0x0C, 0x26, 0x01, 0x8C, + 0x2C, 0x01, 0x0C, 0x35, 0x01, 0xCC, 0x3C, 0x01, 0x8C, 0x42, 0x01, 0x8C, 0x4A, 0x01, 0x8C, 0x56, + 0x01, 0x4C, 0x63, 0x01, 0xCC, 0x70, 0x01, 0x4C, 0x7D, 0x01, 0x4C, 0x8B, 0x01, 0x8C, 0x97, 0x01, + 0x0C, 0xA6, 0x01, 0x4C, 0xB4, 0x01, 0xCC, 0xC1, 0x01, 0x4C, 0xCE, 0x01, 0x0C, 0xDD, 0x01, 0x0C, + 0xEC, 0x01, 0x8C, 0xF8, 0x01, 0x4C, 0x08, 0x02, 0xCC, 0x14, 0x02, 0x8C, 0x21, 0x02, 0x8C, 0x2E, + 0x02, 0x8C, 0x3B, 0x02, 0x8C, 0x49, 0x02, 0x0C, 0x56, 0x02, 0x4C, 0x63, 0x02, 0x4C, 0x72, 0x02, + 0x4C, 0x7F, 0x02, 0x4C, 0x8C, 0x02, 0x8C, 0x99, 0x02, 0xCC, 0xA6, 0x02, 0xCC, 0xB4, 0x02, 0x0C, + 0xC2, 0x02, 0x4C, 0xD6, 0x02, 0x0C, 0xE7, 0x02, 0x4C, 0xFB, 0x02, 0x0C, 0x03, 0x03, 0xCC, 0x05, + 0x03, 0x4C, 0x09, 0x03, 0x4C, 0x13, 0x03, 0x4C, 0x21, 0x03, 0xCC, 0x2B, 0x03, 0x0C, 0x39, 0x03, + 0x0C, 0x43, 0x03, 0x0C, 0x52, 0x03, 0x8C, 0x5E, 0x03, 0x0C, 0x6C, 0x03, 0x4C, 0x7A, 0x03, 0xCC, + 0x89, 0x03, 0x4C, 0x97, 0x03, 0x8C, 0xA6, 0x03, 0x0C, 0xB0, 0x03, 0x8C, 0xB9, 0x03, 0x4C, 0xC3, + 0x03, 0xCC, 0xCF, 0x03, 0x0C, 0xDD, 0x03, 0x4C, 0xE6, 0x03, 0x0C, 0xF0, 0x03, 0x4C, 0xFD, 0x03, + 0x4C, 0x07, 0x04, 0x4C, 0x11, 0x04, 0xCC, 0x1A, 0x04, 0xCC, 0x24, 0x04, 0x8C, 0x32, 0x04, 0x8C, + 0x3C, 0x04, 0xCC, 0x4F, 0x04, 0x4C, 0x62, 0x04, 0xCC, 0x75, 0x04, 0x04, 0xFB, 0xE8, 0x11, 0x00, + 0x42, 0x00, 0x07, 0x00, 0x80, 0x04, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, + 0x80, 0x2C, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, + 0x80, 0x2C, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, 0x14, 0x08, 0x00, + 0x80, 0x2C, 0x02, 0x00, 0x80, 0x3C, 0x10, 0x00, 0x06, 0x00, 0x8D, 0x80, 0xC3, 0x01, 0x80, 0xC3, + 0x01, 0x80, 0xC3, 0x01, 0x80, 0xC2, 0x01, 0x40, 0x82, 0x2E, 0x00, 0x07, 0x00, 0x02, 0x04, 0x80, + 0x00, 0x02, 0x0D, 0x80, 0x00, 0x02, 0x0D, 0x80, 0x00, 0x02, 0x0A, 0x97, 0x00, 0x0A, 0x0B, 0xF8, + 0xFF, 0xBF, 0x50, 0x57, 0x17, 0x40, 0x43, 0x03, 0x80, 0x82, 0x02, 0xD4, 0xD6, 0x16, 0xFD, 0xFF, + 0x2F, 0xC0, 0xD1, 0x01, 0x02, 0xD0, 0x83, 0x00, 0xE0, 0xA0, 0x00, 0x02, 0xA0, 0x10, 0x00, 0x81, + 0x00, 0x24, 0x02, 0x00, 0x80, 0x34, 0x02, 0x00, 0x95, 0x78, 0x00, 0x80, 0xFF, 0x07, 0xD0, 0x56, + 0x0F, 0xE0, 0x00, 0x1E, 0xF0, 0x00, 0x2D, 0xE0, 0x01, 0x00, 0xD0, 0x07, 0x00, 0x40, 0xBF, 0x02, + 0x00, 0x95, 0xF4, 0x07, 0x00, 0x40, 0x1F, 0x10, 0x00, 0x2D, 0x74, 0x00, 0x2D, 0xB0, 0x00, 0x2D, + 0xE0, 0x96, 0x0F, 0x80, 0xFF, 0x06, 0x00, 0x38, 0x02, 0x00, 0x80, 0x38, 0x0A, 0x00, 0x06, 0x00, + 0x80, 0x50, 0x02, 0x00, 0x90, 0xFC, 0x03, 0x00, 0x0D, 0x0B, 0x01, 0x0A, 0x4A, 0x07, 0x0E, 0x8A, + 0x02, 0x6D, 0xD7, 0x00, 0xA4, 0xB1, 0x02, 0x00, 0x80, 0x34, 0x02, 0x00, 0x80, 0x1C, 0x02, 0x00, + 0x90, 0x8E, 0x2F, 0x00, 0xD7, 0x75, 0x80, 0xA2, 0xB0, 0xC0, 0xA1, 0xA0, 0x00, 0xE0, 0x70, 0x00, + 0x80, 0x2F, 0x0F, 0x00, 0x07, 0x00, 0xAD, 0x15, 0x00, 0x80, 0xFF, 0x00, 0xD0, 0xD2, 0x02, 0xE0, + 0xC1, 0x02, 0xE0, 0xC1, 0x02, 0xD0, 0xE2, 0x01, 0xC0, 0x7F, 0x00, 0x80, 0x0F, 0x00, 0xE0, 0x2E, + 0x24, 0xB4, 0x78, 0x74, 0x3C, 0xF0, 0x39, 0x3C, 0xD0, 0x2F, 0x38, 0x40, 0x0F, 0xF4, 0xE5, 0x2F, + 0xD0, 0xBF, 0x7D, 0x00, 0x04, 0x0D, 0x00, 0x07, 0x00, 0x80, 0x1D, 0x02, 0x00, 0x80, 0x1D, 0x02, + 0x00, 0x80, 0x1D, 0x02, 0x00, 0x80, 0x1D, 0x02, 0x00, 0x80, 0x08, 0x2E, 0x00, 0x04, 0x00, 0x86, + 0x40, 0x01, 0x00, 0xE0, 0x01, 0x00, 0x74, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, 0x1D, 0x02, + 0x00, 0x80, 0x0E, 0x02, 0x00, 0x95, 0x0B, 0x00, 0x40, 0x0B, 0x00, 0x40, 0x07, 0x00, 0x40, 0x07, + 0x00, 0x80, 0x07, 0x00, 0x40, 0x07, 0x00, 0x40, 0x07, 0x00, 0x40, 0x0B, 0x02, 0x00, 0x80, 0x0B, + 0x02, 0x00, 0x80, 0x0E, 0x02, 0x00, 0x80, 0x1D, 0x02, 0x00, 0x80, 0x38, 0x02, 0x00, 0x80, 0xB0, + 0x02, 0x00, 0x81, 0xD0, 0x01, 0x02, 0x00, 0x80, 0x01, 0x03, 0x00, 0x84, 0x80, 0x01, 0x00, 0x40, + 0x07, 0x02, 0x00, 0x80, 0x0E, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, 0x78, 0x02, 0x00, 0x80, + 0xB4, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xE0, 0x02, 0x00, 0x8C, 0xE0, 0x01, 0x00, 0xE0, + 0x01, 0x00, 0xE0, 0x01, 0x00, 0xE0, 0x01, 0x00, 0xE0, 0x02, 0x00, 0x80, 0xE0, 0x02, 0x00, 0x80, + 0xB0, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, 0x38, 0x02, 0x00, 0x80, 0x1D, 0x02, 0x00, 0x85, + 0x0B, 0x00, 0x80, 0x02, 0x00, 0x40, 0x02, 0x00, 0x07, 0x00, 0x80, 0x10, 0x02, 0x00, 0x80, 0x38, + 0x02, 0x00, 0x8C, 0x34, 0x00, 0x10, 0x34, 0x10, 0xF4, 0x7A, 0x2E, 0x90, 0xFF, 0x1A, 0x00, 0xBC, + 0x02, 0x00, 0x87, 0xDB, 0x01, 0x80, 0x87, 0x03, 0x80, 0x42, 0x07, 0x1E, 0x00, 0x10, 0x00, 0x80, + 0x28, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x8C, 0x3C, 0x00, 0xA8, 0xBE, + 0x2A, 0xFC, 0xFF, 0x3F, 0x50, 0x7D, 0x05, 0x00, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, + 0x3C, 0x02, 0x00, 0x80, 0x28, 0x13, 0x00, 0x2E, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, + 0x00, 0x80, 0x1E, 0x02, 0x00, 0x83, 0x0F, 0x00, 0x40, 0x07, 0x07, 0x00, 0x1E, 0x00, 0x85, 0xF0, + 0xFF, 0x0B, 0x90, 0xAA, 0x06, 0x1E, 0x00, 0x2B, 0x00, 0x80, 0x24, 0x02, 0x00, 0x80, 0xBC, 0x02, + 0x00, 0x80, 0x7C, 0x10, 0x00, 0x08, 0x00, 0x80, 0x04, 0x02, 0x00, 0x8E, 0x0B, 0x00, 0x40, 0x07, + 0x00, 0x80, 0x03, 0x00, 0xC0, 0x02, 0x00, 0xD0, 0x01, 0x00, 0xA0, 0x02, 0x00, 0x80, 0x74, 0x02, + 0x00, 0x80, 0x38, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, 0x1D, 0x02, 0x00, 0x80, 0x0E, 0x02, + 0x00, 0x8B, 0x0B, 0x00, 0x40, 0x03, 0x00, 0xC0, 0x02, 0x00, 0xD0, 0x01, 0x00, 0x40, 0x0B, 0x00, + 0x07, 0x00, 0xAD, 0x55, 0x00, 0x80, 0xFF, 0x02, 0xE0, 0x42, 0x0B, 0xB0, 0x00, 0x1E, 0x74, 0x00, + 0x1D, 0x78, 0x00, 0x2E, 0x78, 0xD0, 0x2F, 0x78, 0xB8, 0x2D, 0x78, 0x1E, 0x2D, 0xF8, 0x07, 0x2D, + 0xB8, 0x00, 0x2D, 0x74, 0x00, 0x1D, 0xB0, 0x00, 0x0E, 0xE0, 0x96, 0x0B, 0x40, 0xFF, 0x02, 0x00, + 0x14, 0x0D, 0x00, 0x0A, 0x00, 0x89, 0xB4, 0x00, 0x90, 0xBF, 0x00, 0xF0, 0xB6, 0x00, 0x10, 0xB4, + 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, + 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, + 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x10, 0x00, 0x07, 0x00, 0x98, 0x15, 0x00, 0xD0, + 0xFF, 0x01, 0xB4, 0xD1, 0x07, 0x3C, 0x40, 0x0B, 0x2C, 0x00, 0x0B, 0x00, 0x40, 0x0B, 0x00, 0x80, + 0x07, 0x00, 0xD0, 0x02, 0x00, 0xB4, 0x02, 0x00, 0x80, 0x3D, 0x02, 0x00, 0x8D, 0x0F, 0x00, 0xC0, + 0x07, 0x00, 0xE0, 0x01, 0x00, 0xB8, 0x55, 0x15, 0xFC, 0xFF, 0x1F, 0x0F, 0x00, 0x07, 0x00, 0x9C, + 0x15, 0x00, 0xD0, 0xFF, 0x01, 0xB4, 0xD1, 0x07, 0x38, 0x40, 0x0B, 0x14, 0x00, 0x0B, 0x00, 0x40, + 0x0B, 0x00, 0xD0, 0x03, 0x40, 0xFF, 0x01, 0x00, 0xE9, 0x02, 0x00, 0x40, 0x0B, 0x02, 0x00, 0x8E, + 0x0F, 0x28, 0x00, 0x0F, 0x3C, 0x40, 0x0B, 0xF4, 0xD5, 0x07, 0xD0, 0xBF, 0x01, 0x00, 0x04, 0x0D, + 0x00, 0x07, 0x00, 0xAB, 0x40, 0x01, 0x00, 0xD0, 0x03, 0x00, 0xF0, 0x03, 0x00, 0xF8, 0x03, 0x00, + 0x9D, 0x03, 0x00, 0x8B, 0x03, 0x80, 0x83, 0x03, 0xD0, 0x81, 0x03, 0xB0, 0x80, 0x03, 0x78, 0x80, + 0x03, 0xBC, 0xEA, 0x2B, 0xA9, 0xEA, 0x2B, 0x00, 0x80, 0x03, 0x00, 0x80, 0x03, 0x00, 0x80, 0x03, + 0x0F, 0x00, 0x06, 0x00, 0x97, 0x40, 0x55, 0x05, 0xC0, 0xFF, 0x1F, 0xC0, 0xAA, 0x1A, 0xD0, 0x01, + 0x00, 0xD0, 0x01, 0x00, 0xD0, 0x51, 0x00, 0xE0, 0xFF, 0x07, 0xE0, 0x96, 0x0F, 0x02, 0x00, 0x80, + 0x1E, 0x02, 0x00, 0x80, 0x2D, 0x02, 0x00, 0x8E, 0x2C, 0x60, 0x00, 0x2C, 0xF0, 0x00, 0x1E, 0xD0, + 0x97, 0x0F, 0x40, 0xFF, 0x02, 0x00, 0x10, 0x0D, 0x00, 0x07, 0x00, 0x80, 0x40, 0x02, 0x00, 0x88, + 0xF9, 0x01, 0x80, 0x6F, 0x00, 0xD0, 0x02, 0x00, 0xF0, 0x02, 0x00, 0x9F, 0xB4, 0x14, 0x00, 0xB4, + 0xFF, 0x02, 0xF8, 0x96, 0x0B, 0xB8, 0x00, 0x0F, 0x78, 0x00, 0x1E, 0x78, 0x00, 0x1D, 0x74, 0x00, + 0x1E, 0xF0, 0x00, 0x0F, 0xD0, 0x96, 0x07, 0x40, 0xFF, 0x01, 0x00, 0x14, 0x0D, 0x00, 0x06, 0x00, + 0x88, 0x54, 0x55, 0x05, 0xFC, 0xFF, 0x2F, 0x54, 0x55, 0x1E, 0x02, 0x00, 0x8E, 0x0E, 0x00, 0x40, + 0x07, 0x00, 0x80, 0x03, 0x00, 0xC0, 0x02, 0x00, 0xE0, 0x01, 0x00, 0xB0, 0x02, 0x00, 0x80, 0x78, + 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, 0x1D, 0x02, 0x00, 0x86, 0x0F, 0x00, 0x40, 0x07, 0x00, + 0xC0, 0x03, 0x10, 0x00, 0x07, 0x00, 0xAD, 0x54, 0x00, 0x80, 0xFF, 0x07, 0xD0, 0x46, 0x0F, 0xE0, + 0x00, 0x1E, 0xF0, 0x00, 0x1D, 0xE0, 0x00, 0x1E, 0xD0, 0x46, 0x0B, 0x40, 0xFF, 0x02, 0xD0, 0x9B, + 0x0B, 0xF0, 0x00, 0x1E, 0xB4, 0x00, 0x2C, 0xB4, 0x00, 0x2C, 0xF0, 0x00, 0x2D, 0xE0, 0x96, 0x0F, + 0x40, 0xFF, 0x02, 0x00, 0x10, 0x0D, 0x00, 0x07, 0x00, 0x9F, 0x15, 0x00, 0x80, 0xFF, 0x02, 0xE0, + 0x92, 0x07, 0xB4, 0x00, 0x0F, 0x74, 0x00, 0x1E, 0x78, 0x00, 0x1D, 0x74, 0x00, 0x1D, 0xB4, 0x00, + 0x1E, 0xE0, 0x96, 0x1F, 0x80, 0xBF, 0x1E, 0x00, 0x04, 0x0E, 0x02, 0x00, 0x88, 0x0B, 0x00, 0xD0, + 0x03, 0x40, 0xFA, 0x01, 0x80, 0x2F, 0x10, 0x00, 0x10, 0x00, 0x80, 0x60, 0x02, 0x00, 0x80, 0xF8, + 0x02, 0x00, 0x80, 0xF4, 0x14, 0x00, 0x80, 0x60, 0x02, 0x00, 0x80, 0xF8, 0x02, 0x00, 0x80, 0xF4, + 0x10, 0x00, 0x10, 0x00, 0x80, 0x60, 0x02, 0x00, 0x80, 0xF8, 0x02, 0x00, 0x80, 0xF8, 0x17, 0x00, + 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, 0x38, 0x02, 0x00, + 0x80, 0x2C, 0x07, 0x00, 0x14, 0x00, 0x95, 0x04, 0x00, 0x90, 0x0F, 0x00, 0xF9, 0x06, 0xD0, 0x2F, + 0x00, 0xF4, 0x01, 0x00, 0xE0, 0x0B, 0x00, 0x40, 0xBE, 0x01, 0x00, 0xE0, 0x0F, 0x02, 0x00, 0x80, + 0x09, 0x15, 0x00, 0x15, 0x00, 0x88, 0x50, 0x55, 0x05, 0xF4, 0xFF, 0x1F, 0x50, 0x55, 0x05, 0x06, + 0x00, 0x85, 0xF4, 0xFF, 0x1F, 0x50, 0x55, 0x15, 0x18, 0x00, 0x12, 0x00, 0x80, 0x14, 0x02, 0x00, + 0x84, 0xF4, 0x02, 0x00, 0x90, 0x6F, 0x02, 0x00, 0x8E, 0xF8, 0x07, 0x00, 0x40, 0x1F, 0x00, 0xE4, + 0x0B, 0x40, 0xBF, 0x01, 0xF4, 0x07, 0x00, 0x64, 0x17, 0x00, 0x07, 0x00, 0x8A, 0x55, 0x00, 0x80, + 0xFF, 0x07, 0xE0, 0x96, 0x0F, 0xB0, 0x00, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x88, 0x0F, + 0x00, 0x80, 0x0B, 0x00, 0xD0, 0x02, 0x00, 0xB4, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x2C, + 0x08, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x10, 0x00, 0x07, 0x00, 0x89, 0x10, 0x00, 0x40, + 0xFE, 0x06, 0xD0, 0x02, 0x0E, 0x70, 0x10, 0x02, 0x28, 0x97, 0xFD, 0x31, 0x1C, 0x8B, 0x71, 0x4C, + 0x83, 0x61, 0x4D, 0xC2, 0x61, 0x8D, 0xC2, 0x70, 0x8D, 0xC2, 0x30, 0x4D, 0xFB, 0x29, 0x1C, 0x5A, + 0x0B, 0x38, 0x02, 0x00, 0x85, 0xE0, 0x55, 0x01, 0x80, 0xFF, 0x01, 0x0F, 0x00, 0x07, 0x00, 0x80, + 0x10, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x7D, 0x02, 0x00, 0x80, 0xBE, 0x02, 0x00, 0x80, + 0xEE, 0x02, 0x00, 0x9C, 0xDB, 0x01, 0x40, 0xC7, 0x02, 0x80, 0x83, 0x03, 0xC0, 0x42, 0x07, 0xD0, + 0x56, 0x0B, 0xE0, 0xFF, 0x0F, 0xB0, 0x55, 0x1E, 0x74, 0x00, 0x2C, 0x38, 0x00, 0x3C, 0x2C, 0x00, + 0x78, 0x0F, 0x00, 0x06, 0x00, 0xAC, 0x50, 0x15, 0x00, 0xF4, 0xFF, 0x02, 0xB4, 0x95, 0x0F, 0xB4, + 0x00, 0x1E, 0xB4, 0x00, 0x2D, 0xB4, 0x00, 0x1E, 0xB4, 0x90, 0x0B, 0xF4, 0xFF, 0x02, 0xB4, 0x95, + 0x0F, 0xB4, 0x00, 0x2D, 0xB4, 0x00, 0x3C, 0xB4, 0x00, 0x3C, 0xB4, 0x00, 0x2E, 0xB4, 0xAA, 0x0F, + 0xF4, 0xFF, 0x01, 0x0F, 0x00, 0x07, 0x00, 0x8E, 0x54, 0x00, 0x80, 0xFF, 0x07, 0xE0, 0x42, 0x0F, + 0xB4, 0x00, 0x2D, 0x78, 0x00, 0x2C, 0x38, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, + 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x90, 0x38, 0x00, 0x14, 0x78, 0x00, 0x2C, + 0xB0, 0x00, 0x1E, 0xD0, 0x96, 0x0B, 0x40, 0xFF, 0x02, 0x00, 0x10, 0x0D, 0x00, 0x06, 0x00, 0xAB, + 0x50, 0x05, 0x00, 0xF4, 0xBF, 0x01, 0xB4, 0xE5, 0x07, 0x74, 0x00, 0x0F, 0x74, 0x00, 0x2D, 0x74, + 0x00, 0x3C, 0x74, 0x00, 0x38, 0x74, 0x00, 0x38, 0x74, 0x00, 0x38, 0x74, 0x00, 0x38, 0x74, 0x00, + 0x2C, 0x74, 0x00, 0x1D, 0x74, 0x40, 0x0F, 0xB4, 0xE9, 0x03, 0xF4, 0x6F, 0x10, 0x00, 0x06, 0x00, + 0x89, 0x50, 0x55, 0x05, 0xF4, 0xFF, 0x1F, 0xB4, 0x55, 0x05, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, + 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x86, 0xF4, 0xFF, 0x0B, 0xB4, 0x55, 0x05, + 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x85, + 0xB4, 0xAA, 0x1A, 0xF4, 0xFF, 0x2F, 0x0F, 0x00, 0x06, 0x00, 0x89, 0x50, 0x55, 0x05, 0xF0, 0xFF, + 0x2F, 0xB0, 0x55, 0x15, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, + 0xB0, 0x02, 0x00, 0x86, 0xF0, 0xAA, 0x06, 0xF0, 0xAA, 0x06, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, + 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x11, + 0x00, 0x07, 0x00, 0x8E, 0x54, 0x00, 0x80, 0xFF, 0x06, 0xE0, 0x46, 0x0F, 0xB4, 0x00, 0x2D, 0x78, + 0x00, 0x2C, 0x3C, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x96, 0x2C, 0xE0, + 0x3F, 0x3C, 0x50, 0x3D, 0x38, 0x00, 0x3C, 0x78, 0x00, 0x3C, 0xF0, 0x00, 0x3C, 0xD0, 0x57, 0x2E, + 0x40, 0xFF, 0x06, 0x00, 0x10, 0x0D, 0x00, 0x06, 0x00, 0xAC, 0x10, 0x00, 0x04, 0x38, 0x00, 0x2C, + 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x78, 0x00, 0x2D, 0xF8, + 0xFF, 0x2F, 0x78, 0x55, 0x2D, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, + 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x0F, 0x00, 0x06, 0x00, 0x8A, 0x50, 0x55, 0x05, 0xF4, + 0xFF, 0x1F, 0x50, 0x7D, 0x05, 0x00, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, + 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, + 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x87, 0x3C, 0x00, 0xA4, 0xBE, 0x1A, 0xF4, + 0xFF, 0x1F, 0x0F, 0x00, 0x08, 0x00, 0x80, 0x04, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, + 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, + 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x8E, 0x1E, + 0x3C, 0x00, 0x0E, 0x78, 0x40, 0x0B, 0xF0, 0xE6, 0x07, 0x90, 0xBF, 0x01, 0x00, 0x04, 0x0D, 0x00, + 0x06, 0x00, 0xAC, 0x10, 0x00, 0x14, 0xB4, 0x00, 0x2D, 0xB4, 0x40, 0x0F, 0xB4, 0xC0, 0x03, 0xB4, + 0xF0, 0x01, 0xB4, 0x78, 0x00, 0xB4, 0x2D, 0x00, 0xB4, 0x2F, 0x00, 0xF4, 0x7B, 0x00, 0xF4, 0xF5, + 0x00, 0xB4, 0xE0, 0x02, 0xB4, 0xC0, 0x07, 0xB4, 0x40, 0x0F, 0xB4, 0x00, 0x2E, 0xB4, 0x00, 0x7C, + 0x0F, 0x00, 0x06, 0x00, 0x80, 0x10, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, + 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, + 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, + 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x85, 0xF0, 0xAA, 0x1A, 0xF0, 0xFF, 0x2F, 0x0F, + 0x00, 0x06, 0x00, 0xAC, 0x10, 0x00, 0x04, 0xF8, 0x00, 0x2E, 0xF8, 0x01, 0x2F, 0xF8, 0x42, 0x2F, + 0xB8, 0x83, 0x2E, 0x78, 0xC7, 0x2D, 0x78, 0xEB, 0x2C, 0x38, 0xBE, 0x2C, 0x78, 0x7D, 0x2C, 0x78, + 0x3C, 0x2C, 0x78, 0x28, 0x2C, 0x78, 0x00, 0x2C, 0x78, 0x00, 0x2C, 0x78, 0x00, 0x2C, 0x78, 0x00, + 0x2C, 0x0F, 0x00, 0x06, 0x00, 0x97, 0x10, 0x00, 0x04, 0xB8, 0x00, 0x2D, 0xF8, 0x00, 0x2D, 0xF8, + 0x02, 0x2D, 0xF8, 0x07, 0x2D, 0x78, 0x0B, 0x2D, 0x78, 0x1E, 0x2D, 0x78, 0x2C, 0x2D, 0x02, 0x78, + 0x92, 0x2D, 0x78, 0xB0, 0x2D, 0x78, 0xE0, 0x2E, 0x78, 0xC0, 0x2F, 0x78, 0x80, 0x2F, 0x78, 0x00, + 0x2F, 0x78, 0x00, 0x2D, 0x0F, 0x00, 0x07, 0x00, 0x98, 0x15, 0x00, 0x80, 0xFF, 0x02, 0xE0, 0x96, + 0x0B, 0xB4, 0x00, 0x1E, 0x78, 0x00, 0x2D, 0x38, 0x00, 0x2C, 0x3C, 0x00, 0x3C, 0x2C, 0x00, 0x3C, + 0x2C, 0x00, 0x02, 0x3C, 0x92, 0x00, 0x3C, 0x38, 0x00, 0x2C, 0x78, 0x00, 0x2D, 0xB0, 0x00, 0x0E, + 0xD0, 0xD7, 0x07, 0x40, 0xFF, 0x01, 0x00, 0x14, 0x0D, 0x00, 0x06, 0x00, 0x9E, 0x50, 0x15, 0x00, + 0xF0, 0xFF, 0x07, 0xB0, 0x55, 0x1F, 0xB0, 0x00, 0x3C, 0xB0, 0x00, 0x38, 0xB0, 0x00, 0x38, 0xB0, + 0x00, 0x3C, 0xB0, 0x55, 0x1F, 0xF0, 0xFF, 0x07, 0xB0, 0x55, 0x00, 0xB0, 0x02, 0x00, 0x80, 0xB0, + 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x11, 0x00, 0x07, 0x00, + 0xAE, 0x55, 0x00, 0x80, 0xFF, 0x02, 0xE0, 0x96, 0x0B, 0xB4, 0x00, 0x1E, 0x38, 0x00, 0x2C, 0x3C, + 0x00, 0x3C, 0x2C, 0x00, 0x38, 0x2C, 0x00, 0x38, 0x2C, 0x00, 0x38, 0x2C, 0x00, 0x38, 0x3C, 0x00, + 0x3C, 0x78, 0x00, 0x2D, 0xB4, 0x00, 0x1E, 0xE0, 0x96, 0x0B, 0x40, 0xFF, 0x07, 0x00, 0x44, 0x2F, + 0x02, 0x00, 0x80, 0x38, 0x09, 0x00, 0x06, 0x00, 0xAC, 0x50, 0x15, 0x00, 0xF4, 0xFF, 0x02, 0xB4, + 0x95, 0x0F, 0xB4, 0x00, 0x2D, 0xB4, 0x00, 0x2C, 0xB4, 0x00, 0x2C, 0xB4, 0x00, 0x1E, 0xB4, 0x95, + 0x0B, 0xF4, 0xFF, 0x02, 0xB4, 0xE5, 0x01, 0xB4, 0xC0, 0x03, 0xB4, 0x40, 0x07, 0xB4, 0x00, 0x0F, + 0xB4, 0x00, 0x1E, 0xB4, 0x00, 0x3C, 0x0F, 0x00, 0x07, 0x00, 0x8E, 0x54, 0x00, 0x80, 0xFF, 0x07, + 0xE0, 0x46, 0x1F, 0xB4, 0x00, 0x2D, 0x74, 0x00, 0x2C, 0xB4, 0x02, 0x00, 0x8B, 0xE0, 0x07, 0x00, + 0x80, 0xBF, 0x01, 0x00, 0xF4, 0x0B, 0x00, 0x40, 0x1F, 0x02, 0x00, 0x8E, 0x3C, 0x38, 0x00, 0x3C, + 0xB4, 0x00, 0x3D, 0xE0, 0x96, 0x1F, 0x40, 0xFF, 0x06, 0x00, 0x10, 0x0D, 0x00, 0x06, 0x00, 0x8A, + 0x54, 0x55, 0x15, 0xFD, 0xFF, 0x7F, 0x54, 0x7D, 0x15, 0x00, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, + 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, + 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x02, + 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x3C, 0x10, 0x00, 0x06, 0x00, 0xAE, 0x10, 0x00, 0x04, 0x38, + 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, + 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2D, 0x78, 0x00, 0x2D, + 0xB4, 0x00, 0x1E, 0xE0, 0x96, 0x0B, 0x40, 0xFF, 0x01, 0x00, 0x14, 0x0D, 0x00, 0x06, 0x00, 0xA2, + 0x04, 0x00, 0x10, 0x3C, 0x00, 0x3C, 0x38, 0x00, 0x2D, 0x74, 0x00, 0x1D, 0xB0, 0x00, 0x0E, 0xE0, + 0x00, 0x0B, 0xE0, 0x41, 0x07, 0xD0, 0x82, 0x03, 0xC0, 0xC3, 0x02, 0x80, 0xD7, 0x01, 0x40, 0xE7, + 0x01, 0x00, 0xFB, 0x02, 0x00, 0x80, 0xBE, 0x02, 0x00, 0x80, 0x7D, 0x02, 0x00, 0x80, 0x3C, 0x10, + 0x00, 0x06, 0x00, 0x80, 0x04, 0x02, 0x10, 0x8A, 0x2D, 0x38, 0x74, 0x2C, 0x7C, 0x74, 0x2C, 0x7C, + 0x74, 0x28, 0xBD, 0x02, 0x38, 0x80, 0xAD, 0x02, 0x38, 0x99, 0xDA, 0x38, 0x34, 0xDB, 0x2C, 0x74, + 0xC7, 0x2D, 0xB4, 0xC7, 0x1E, 0xB0, 0x83, 0x1E, 0xF0, 0x83, 0x1F, 0xF0, 0x42, 0x0F, 0xE0, 0x42, + 0x0F, 0xE0, 0x01, 0x0F, 0x0F, 0x00, 0x06, 0x00, 0x93, 0x14, 0x00, 0x14, 0x78, 0x00, 0x3D, 0xF0, + 0x00, 0x1E, 0xD0, 0x42, 0x0B, 0xC0, 0xC3, 0x03, 0x40, 0xDB, 0x02, 0x00, 0xFE, 0x02, 0x00, 0x80, + 0x7C, 0x02, 0x00, 0x80, 0xBD, 0x02, 0x00, 0x90, 0xEF, 0x01, 0x40, 0xD7, 0x02, 0xC0, 0x83, 0x07, + 0xE0, 0x01, 0x0F, 0xB4, 0x00, 0x2E, 0x7C, 0x00, 0x3C, 0x0F, 0x00, 0x06, 0x00, 0x96, 0x04, 0x00, + 0x14, 0x3C, 0x00, 0x2D, 0x78, 0x00, 0x1E, 0xF0, 0x00, 0x0F, 0xE0, 0x81, 0x07, 0xC0, 0xC2, 0x03, + 0x80, 0xD7, 0x01, 0x00, 0xFB, 0x02, 0x00, 0x80, 0x7E, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, + 0x2C, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, 0x2C, 0x02, 0x00, 0x80, + 0x2C, 0x10, 0x00, 0x06, 0x00, 0x93, 0x54, 0x55, 0x05, 0xF8, 0xFF, 0x1F, 0x54, 0x55, 0x0F, 0x00, + 0x80, 0x07, 0x00, 0xD0, 0x02, 0x00, 0xE0, 0x01, 0x00, 0xB4, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, + 0x8B, 0x1E, 0x00, 0x40, 0x0B, 0x00, 0xC0, 0x03, 0x00, 0xE0, 0x01, 0x00, 0xB4, 0x02, 0x00, 0x85, + 0xB8, 0xAA, 0x1A, 0xFC, 0xFF, 0x2F, 0x0F, 0x00, 0x81, 0x00, 0x55, 0x02, 0x00, 0x80, 0xFF, 0x02, + 0x00, 0x80, 0x5F, 0x02, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, + 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, + 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, + 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, + 0x00, 0x80, 0x5F, 0x02, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x06, 0x00, 0x80, 0x40, 0x02, 0x00, 0x8A, + 0xD0, 0x01, 0x00, 0xC0, 0x02, 0x00, 0x80, 0x03, 0x00, 0x40, 0x07, 0x02, 0x00, 0x80, 0x0B, 0x02, + 0x00, 0x80, 0x0E, 0x02, 0x00, 0x80, 0x1D, 0x02, 0x00, 0x80, 0x38, 0x02, 0x00, 0x80, 0x74, 0x02, + 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xE0, 0x02, 0x00, 0x87, 0xD0, 0x01, 0x00, 0xC0, 0x02, 0x00, + 0x40, 0x07, 0x02, 0x00, 0x80, 0x0B, 0x02, 0x00, 0x80, 0x05, 0x09, 0x00, 0x81, 0x00, 0x55, 0x02, + 0x00, 0x80, 0xBF, 0x02, 0x00, 0x80, 0xB5, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, + 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, + 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, + 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, + 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB5, 0x02, 0x00, 0x80, 0xBF, 0x07, 0x00, 0x0A, 0x00, 0x80, + 0x3C, 0x02, 0x00, 0x80, 0x7D, 0x02, 0x00, 0x80, 0xBE, 0x02, 0x00, 0x8D, 0xEB, 0x00, 0x80, 0xC3, + 0x02, 0xC0, 0x82, 0x03, 0xD0, 0x41, 0x07, 0x50, 0x00, 0x05, 0x21, 0x00, 0x33, 0x00, 0x85, 0xF4, + 0xFF, 0x1F, 0x54, 0x55, 0x15, 0x09, 0x00, 0x07, 0x00, 0x80, 0x15, 0x02, 0x00, 0x80, 0x3C, 0x02, + 0x00, 0x80, 0xB4, 0x34, 0x00, 0x12, 0x00, 0xA2, 0x40, 0xAA, 0x01, 0xD0, 0xEB, 0x07, 0xF0, 0x40, + 0x0F, 0x50, 0x00, 0x0E, 0x00, 0x55, 0x0E, 0xD0, 0xFF, 0x0F, 0xF0, 0x01, 0x0E, 0x74, 0x00, 0x0E, + 0x74, 0x00, 0x0F, 0xF0, 0xE6, 0x1F, 0xD0, 0xBF, 0x1E, 0x00, 0x04, 0x0D, 0x00, 0x06, 0x00, 0x80, + 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0xA2, + 0xB4, 0xA9, 0x01, 0xF4, 0xEF, 0x07, 0xF4, 0x41, 0x0F, 0xB4, 0x00, 0x1E, 0xB4, 0x00, 0x2D, 0xB4, + 0x00, 0x2D, 0xB4, 0x00, 0x2D, 0xB4, 0x00, 0x1D, 0xB4, 0x00, 0x1E, 0xF4, 0x96, 0x0B, 0x74, 0xFE, + 0x02, 0x00, 0x10, 0x0D, 0x00, 0x13, 0x00, 0x8B, 0xA9, 0x01, 0xD0, 0xEB, 0x07, 0xF0, 0x01, 0x0F, + 0xB4, 0x00, 0x1D, 0x78, 0x02, 0x00, 0x80, 0x78, 0x02, 0x00, 0x80, 0x78, 0x02, 0x00, 0x8D, 0x74, + 0x00, 0x04, 0xF0, 0x00, 0x1D, 0xD0, 0x96, 0x0B, 0x40, 0xFF, 0x02, 0x00, 0x10, 0x0D, 0x00, 0x08, + 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0xA3, 0x1E, 0x40, + 0x6A, 0x1E, 0xD0, 0xEF, 0x1F, 0xF0, 0x41, 0x1F, 0xB4, 0x00, 0x1E, 0x78, 0x00, 0x1E, 0x78, 0x00, + 0x1E, 0x78, 0x00, 0x1E, 0x74, 0x00, 0x1E, 0xF0, 0x00, 0x1E, 0xE0, 0x96, 0x1F, 0x80, 0xBF, 0x1E, + 0x00, 0x04, 0x0D, 0x00, 0x13, 0x00, 0x94, 0xA9, 0x01, 0xC0, 0xEB, 0x07, 0xE0, 0x01, 0x0F, 0xB4, + 0x00, 0x1D, 0x78, 0x55, 0x2D, 0xF8, 0xFF, 0x2F, 0x78, 0x55, 0x05, 0x78, 0x02, 0x00, 0x8A, 0xF0, + 0x00, 0x04, 0xD0, 0x57, 0x1F, 0x40, 0xFF, 0x06, 0x00, 0x10, 0x0D, 0x00, 0x04, 0x00, 0x89, 0x40, + 0x15, 0x00, 0xF4, 0x3F, 0x00, 0x7C, 0x10, 0x00, 0x1D, 0x02, 0x00, 0x89, 0x1E, 0x00, 0xA4, 0xAE, + 0x0A, 0xA4, 0xBF, 0x1A, 0x00, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, + 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, + 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x10, 0x00, 0x12, 0x00, 0xAC, 0x40, 0x6A, 0x09, 0xD0, 0xEF, + 0x1E, 0xF0, 0x41, 0x1F, 0xB4, 0x00, 0x1E, 0x78, 0x00, 0x1E, 0x78, 0x00, 0x1E, 0x78, 0x00, 0x1E, + 0x74, 0x00, 0x1E, 0xF0, 0x00, 0x1E, 0xE0, 0x96, 0x1F, 0x80, 0xBF, 0x1E, 0x00, 0x04, 0x1E, 0x10, + 0x00, 0x0F, 0xF0, 0xD6, 0x07, 0x80, 0xFF, 0x01, 0x03, 0x00, 0x06, 0x00, 0x80, 0xB4, 0x02, 0x00, + 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0xA0, 0xB4, 0xA8, 0x01, + 0xB4, 0xEF, 0x0B, 0xF4, 0x01, 0x0F, 0xB4, 0x00, 0x1D, 0xB4, 0x00, 0x1D, 0xB4, 0x00, 0x1D, 0xB4, + 0x00, 0x1D, 0xB4, 0x00, 0x1D, 0xB4, 0x00, 0x1D, 0xB4, 0x00, 0x1D, 0xB4, 0x00, 0x1D, 0x0F, 0x00, + 0x07, 0x00, 0x80, 0x10, 0x02, 0x00, 0x80, 0x78, 0x02, 0x00, 0x80, 0x64, 0x04, 0x00, 0x84, 0xA0, + 0x6A, 0x00, 0xF0, 0x7F, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, 0x74, + 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x87, 0x74, + 0x00, 0xA0, 0xBA, 0x1A, 0xF0, 0xFF, 0x2F, 0x0F, 0x00, 0x07, 0x00, 0x80, 0x40, 0x02, 0x00, 0x83, + 0xE0, 0x01, 0x00, 0x90, 0x04, 0x00, 0xAF, 0x80, 0xAA, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0xE0, 0x01, + 0x00, 0xE0, 0x01, 0x00, 0xE0, 0x01, 0x00, 0xE0, 0x01, 0x00, 0xE0, 0x01, 0x00, 0xE0, 0x01, 0x00, + 0xE0, 0x01, 0x00, 0xE0, 0x01, 0x00, 0xE0, 0x01, 0x00, 0xE0, 0x01, 0x00, 0xE0, 0x00, 0x50, 0xB9, + 0x00, 0xF0, 0x2F, 0x00, 0x40, 0x01, 0x00, 0x06, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, + 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0xA0, 0xB4, 0x00, 0x0A, 0xB4, 0x80, 0x07, + 0xB4, 0xE0, 0x01, 0xB4, 0x78, 0x00, 0xB4, 0x1E, 0x00, 0xF4, 0x2F, 0x00, 0xF4, 0x79, 0x00, 0xB4, + 0xF0, 0x01, 0xB4, 0xD0, 0x03, 0xB4, 0x40, 0x0B, 0xB4, 0x00, 0x2E, 0x0F, 0x00, 0x06, 0x00, 0x84, + 0xF0, 0x7F, 0x00, 0xA0, 0x7A, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, + 0x74, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, + 0x74, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x80, 0x74, 0x02, 0x00, 0x87, + 0x74, 0x00, 0xA0, 0xBA, 0x1A, 0xF0, 0xFF, 0x2F, 0x0F, 0x00, 0x12, 0x00, 0xA0, 0x58, 0x4A, 0x0A, + 0xFC, 0xFF, 0x2E, 0x2C, 0x3C, 0x38, 0x2C, 0x3C, 0x38, 0x2C, 0x3C, 0x38, 0x2C, 0x3C, 0x38, 0x2C, + 0x3C, 0x38, 0x2C, 0x3C, 0x38, 0x2C, 0x3C, 0x38, 0x2C, 0x3C, 0x38, 0x2C, 0x3C, 0x38, 0x0F, 0x00, + 0x12, 0x00, 0xA0, 0x64, 0xA8, 0x01, 0xB4, 0xEF, 0x0B, 0xF4, 0x01, 0x0F, 0xB4, 0x00, 0x1D, 0xB4, + 0x00, 0x1D, 0xB4, 0x00, 0x1D, 0xB4, 0x00, 0x1D, 0xB4, 0x00, 0x1D, 0xB4, 0x00, 0x1D, 0xB4, 0x00, + 0x1D, 0xB4, 0x00, 0x1D, 0x0F, 0x00, 0x13, 0x00, 0xA1, 0xAA, 0x00, 0xD0, 0xEB, 0x07, 0xF0, 0x41, + 0x0F, 0x74, 0x00, 0x1D, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x2C, 0x78, 0x00, 0x2D, + 0xB4, 0x00, 0x1E, 0xE0, 0x96, 0x0B, 0x80, 0xFF, 0x02, 0x00, 0x14, 0x0D, 0x00, 0x12, 0x00, 0xA4, + 0x64, 0xA9, 0x01, 0xB4, 0xFB, 0x07, 0xF4, 0x41, 0x0F, 0xB4, 0x00, 0x1E, 0xB4, 0x00, 0x2D, 0xB4, + 0x00, 0x2D, 0xB4, 0x00, 0x2D, 0xB4, 0x00, 0x1D, 0xB4, 0x00, 0x0F, 0xF4, 0x96, 0x0B, 0xB4, 0xFE, + 0x02, 0xB4, 0x10, 0x00, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x80, 0xB4, 0x05, 0x00, 0x12, + 0x00, 0xA3, 0x40, 0x6A, 0x09, 0xD0, 0xEB, 0x1F, 0xF0, 0x01, 0x1F, 0xB4, 0x00, 0x1E, 0x78, 0x00, + 0x1E, 0x78, 0x00, 0x1E, 0x78, 0x00, 0x1E, 0x74, 0x00, 0x1E, 0xF0, 0x00, 0x1E, 0xE0, 0x96, 0x1F, + 0x80, 0xBF, 0x1E, 0x00, 0x04, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, 0x80, 0x1E, 0x02, 0x00, + 0x80, 0x1E, 0x03, 0x00, 0x12, 0x00, 0x9F, 0x40, 0x92, 0x1A, 0x80, 0xF7, 0x1F, 0x80, 0x1F, 0x00, + 0x80, 0x07, 0x00, 0x80, 0x03, 0x00, 0x80, 0x03, 0x00, 0x80, 0x03, 0x00, 0x80, 0x03, 0x00, 0x80, + 0x03, 0x00, 0x80, 0x03, 0x00, 0x80, 0x03, 0x10, 0x00, 0x13, 0x00, 0xA1, 0xA9, 0x01, 0xD0, 0xEB, + 0x0B, 0xE0, 0x01, 0x1E, 0xF0, 0x00, 0x19, 0xE0, 0x06, 0x00, 0x80, 0xBF, 0x01, 0x00, 0xA4, 0x0F, + 0x10, 0x00, 0x1E, 0xB4, 0x00, 0x1D, 0xE0, 0x56, 0x0F, 0x80, 0xFF, 0x06, 0x00, 0x10, 0x0D, 0x00, + 0x0D, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x89, 0x0F, 0x00, 0xA4, 0xAF, 0x0A, 0xA8, 0xAF, 0x0A, 0x00, + 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, + 0x0F, 0x02, 0x00, 0x80, 0x0F, 0x02, 0x00, 0x80, 0x0E, 0x02, 0x00, 0x86, 0x6D, 0x09, 0x00, 0xF8, + 0x1F, 0x00, 0x40, 0x0D, 0x00, 0x12, 0x00, 0xA2, 0x60, 0x00, 0x19, 0xB4, 0x00, 0x1E, 0xB4, 0x00, + 0x1E, 0xB4, 0x00, 0x1E, 0xB4, 0x00, 0x1E, 0xB4, 0x00, 0x1E, 0xB4, 0x00, 0x1E, 0xB4, 0x00, 0x1E, + 0xF0, 0x00, 0x1E, 0xE0, 0x96, 0x1F, 0x80, 0xBF, 0x1D, 0x00, 0x04, 0x0D, 0x00, 0x12, 0x00, 0x96, + 0x28, 0x00, 0x18, 0x78, 0x00, 0x2D, 0xB4, 0x00, 0x0E, 0xE0, 0x00, 0x0B, 0xD0, 0x41, 0x07, 0xC0, + 0x82, 0x03, 0x80, 0xC3, 0x02, 0x00, 0xDB, 0x02, 0x00, 0x80, 0xBE, 0x02, 0x00, 0x80, 0x7D, 0x02, + 0x00, 0x80, 0x3C, 0x10, 0x00, 0x12, 0x00, 0xA0, 0x09, 0x14, 0x60, 0x1D, 0x38, 0x70, 0x1C, 0x3C, + 0x74, 0x2C, 0x7D, 0x38, 0x28, 0xAA, 0x28, 0x34, 0xDA, 0x2C, 0x74, 0xD7, 0x1D, 0xB0, 0xC3, 0x0E, + 0xE0, 0x82, 0x0F, 0xE0, 0x42, 0x0B, 0xD0, 0x41, 0x07, 0x0F, 0x00, 0x12, 0x00, 0x8D, 0x64, 0x00, + 0x19, 0xF0, 0x00, 0x1F, 0xD0, 0x82, 0x07, 0x80, 0xD7, 0x02, 0x00, 0xFE, 0x02, 0x00, 0x80, 0x7C, + 0x02, 0x00, 0x8D, 0xBE, 0x00, 0x40, 0xEB, 0x01, 0xC0, 0x83, 0x07, 0xE0, 0x01, 0x0F, 0xB8, 0x00, + 0x2D, 0x0F, 0x00, 0x12, 0x00, 0x99, 0x18, 0x00, 0x24, 0x3C, 0x00, 0x2C, 0xB4, 0x00, 0x1E, 0xF0, + 0x00, 0x0F, 0xD0, 0x41, 0x0B, 0xC0, 0x83, 0x03, 0x80, 0xC7, 0x02, 0x00, 0xEB, 0x01, 0x00, 0xBE, + 0x02, 0x00, 0x80, 0x7D, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x1D, 0x02, 0x00, 0x88, 0x0F, + 0x00, 0x90, 0x07, 0x00, 0xF4, 0x02, 0x00, 0x10, 0x02, 0x00, 0x12, 0x00, 0x8D, 0xA4, 0xAA, 0x0A, + 0xF4, 0xFF, 0x1F, 0x00, 0x80, 0x0B, 0x00, 0xD0, 0x02, 0x00, 0xF4, 0x02, 0x00, 0x80, 0x7C, 0x02, + 0x00, 0x8D, 0x1E, 0x00, 0x80, 0x0B, 0x00, 0xD0, 0x02, 0x00, 0xF4, 0x56, 0x15, 0xF4, 0xFF, 0x2F, + 0x0F, 0x00, 0x05, 0x00, 0x85, 0x05, 0x00, 0xC0, 0x07, 0x00, 0xE0, 0x02, 0x00, 0x80, 0xB0, 0x02, + 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB4, 0x02, + 0x00, 0x86, 0x78, 0x00, 0x80, 0x1F, 0x00, 0x80, 0x1F, 0x02, 0x00, 0x80, 0x78, 0x02, 0x00, 0x80, + 0xB4, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, 0xB0, 0x02, 0x00, 0x80, + 0xF0, 0x02, 0x00, 0x84, 0xE0, 0x01, 0x00, 0x80, 0x07, 0x02, 0x00, 0x80, 0x05, 0x03, 0x00, 0x0A, + 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x02, + 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x02, + 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x02, + 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x02, + 0x00, 0x80, 0x28, 0x02, 0x00, 0x80, 0x28, 0x04, 0x00, 0x03, 0x00, 0x84, 0x40, 0x01, 0x00, 0x40, + 0x0B, 0x02, 0x00, 0x80, 0x2D, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x80, 0x38, 0x02, 0x00, 0x80, + 0x38, 0x02, 0x00, 0x80, 0x38, 0x02, 0x00, 0x80, 0x38, 0x02, 0x00, 0x80, 0xB4, 0x02, 0x00, 0x86, + 0xD0, 0x0B, 0x00, 0xD0, 0x0B, 0x00, 0xB4, 0x02, 0x00, 0x80, 0x38, 0x02, 0x00, 0x80, 0x38, 0x02, + 0x00, 0x80, 0x38, 0x02, 0x00, 0x80, 0x38, 0x02, 0x00, 0x80, 0x3C, 0x02, 0x00, 0x86, 0x1D, 0x00, + 0x40, 0x0B, 0x00, 0x40, 0x01, 0x04, 0x00, 0x1B, 0x00, 0x8B, 0xA0, 0x06, 0x10, 0xBC, 0x1F, 0x70, + 0x0D, 0xB8, 0x3E, 0x05, 0xD0, 0x1F, 0x1B, 0x00, +}; +// clang-format on diff --git a/keyboards/dasky/reverb/graphics/robotomono20.qff.h b/keyboards/dasky/reverb/graphics/robotomono20.qff.h new file mode 100644 index 00000000000..63b82834042 --- /dev/null +++ b/keyboards/dasky/reverb/graphics/robotomono20.qff.h @@ -0,0 +1,11 @@ +// Copyright 2023 QMK -- generated source code only, font retains original copyright +// SPDX-License-Identifier: GPL-2.0-or-later + +// This file was auto-generated by `qmk painter-convert-font-image -i robotomono20.png -f mono4` + +#pragma once + +#include + +extern const uint32_t font_robotomono20_length; +extern const uint8_t font_robotomono20[4904]; diff --git a/keyboards/dasky/reverb/info.json b/keyboards/dasky/reverb/info.json index 18820c05b1f..87b7dd128f5 100644 --- a/keyboards/dasky/reverb/info.json +++ b/keyboards/dasky/reverb/info.json @@ -11,6 +11,7 @@ "bootmagic": true, "extrakey": true, "mousekey": true, + "wpm": true, "quantum_painter": true, "rgb_matrix": true }, diff --git a/keyboards/dasky/reverb/reverb.c b/keyboards/dasky/reverb/reverb.c index 9dd26c6d493..4eb3b4624fe 100644 --- a/keyboards/dasky/reverb/reverb.c +++ b/keyboards/dasky/reverb/reverb.c @@ -1,18 +1,17 @@ // Copyright 2023 Dasky (@daskygit) // SPDX-License-Identifier: GPL-2.0-or-later -#include "reverb.h" -#include "graphics/splash.qgf.h" - -painter_device_t reverb_display; +#include "quantum.h" +#include "graphics/display.h" void keyboard_post_init_kb(void) { - painter_image_handle_t splash_image; - reverb_display = qp_gc9a01_make_spi_device(240, 240, DISPLAY_CS, DISPLAY_DC, DISPLAY_RST, 2, 0); - qp_init(reverb_display, QP_ROTATION_0); - splash_image = qp_load_image_mem(gfx_splash); - qp_drawimage(reverb_display, 0, 0, splash_image); - qp_flush(reverb_display); - qp_close_image(splash_image); + display_init_kb(); keyboard_post_init_user(); } + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + display_key_counter(); + } + return process_record_user(keycode, record); +} diff --git a/keyboards/dasky/reverb/reverb.h b/keyboards/dasky/reverb/reverb.h deleted file mode 100644 index a471534d4dc..00000000000 --- a/keyboards/dasky/reverb/reverb.h +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2023 Dasky (@daskygit) -// SPDX-License-Identifier: GPL-2.0-or-later - -#include - -painter_device_t reverb_display; diff --git a/keyboards/dasky/reverb/rules.mk b/keyboards/dasky/reverb/rules.mk index b029c538cc1..73f57fbe6ad 100644 --- a/keyboards/dasky/reverb/rules.mk +++ b/keyboards/dasky/reverb/rules.mk @@ -1,3 +1,7 @@ -QUANTUM_PAINTER_DRIVERS = gc9a01_spi +QUANTUM_PAINTER_DRIVERS += gc9a01_spi +QUANTUM_PAINTER_DRIVERS += rgb565_surface SRC += graphics/splash.qgf.c +SRC += graphics/reverb.qgf.c +SRC += graphics/display.c +SRC += graphics/robotomono20.qff.c